উত্তর:
lstart
আইএসও ফর্ম্যাটে আউটপুট দেওয়ার মতো কোনও উপায় আছে কিYYYY-MM-DD HH:MM:SS
?
সহ awk
+ date
সহযোগিতা:
ps -eo lstart,pid,cmd --sort=start_time | awk '{
cmd="date -d\""$1 FS $2 FS $3 FS $4 FS $5"\" +\047%Y-%m-%d %H:%M:%S\047";
cmd | getline d; close(cmd); $1=$2=$3=$4=$5=""; printf "%s\n",d$0 }'
পিএস etimes
কীওয়ার্ড ব্যবহার করে বিকল্প পদ্ধতি (প্রক্রিয়া শুরু হওয়ার পরে সময় অতিবাহিত হয়েছে, কয়েক সেকেন্ডে):
ps -eo etimes,pid,cmd --sort=etimes | awk '{
cmd="date -d -"$1"seconds +\047%Y-%m-%d %H:%M:%S\047";
cmd | getline d; close(cmd); $1=""; printf "%s\n",d$0 }'
date -d -"$1"seconds
- বর্তমান টাইমস্ট্যাম্প এবং elapsed
সময়ের মধ্যে পার্থক্য , প্রক্রিয়াটির টাইমস্ট্যাম্প মান দেবেetimes
পরিবর্তে পিএস ফর্ম্যাট ব্যবহার lstart
করেন তবে সেকেন্ডে সময় অতিবাহিত হয়ে যা কিছুটা সহজ date -d -999seconds
।
আপনি এর সাথে বাছাই করতে পারেন:
ps -eo lstart,pid,cmd --sort=start_time
দ্রষ্টব্য যে lstart
মানক ইউনিক্স ps
কলামগুলির মধ্যে একটি নয়।
সমস্ত সিস্টেমে একটি নয় এবং আউটপুট বাস্তবায়নের মধ্যে এবং সম্ভাব্য লোকালগুলির মধ্যে পরিবর্তিত হয়।
উদাহরণস্বরূপ, ফ্রিবিএসডি বা এর ps
মাধ্যমে procps-ng
(সাধারণত এম্বেডড লিনাক্স ভিত্তিক সিস্টেমগুলিতে পাওয়া যায়) এবং C
লোকেলগুলি সহ, আপনি পাবেন:
Wed Nov 1 12:36:15 2017
ম্যাকোজে:
Wed 1 Nov 12:36:15 2017
এছাড়াও, যেহেতু, এটি আপনাকে জিএমটি অফসেট দেয় না, আউটপুটটি ডিএসটি বাস্তবায়িত টাইমজোনগুলিতে অস্পষ্ট (যেখানে বছরের মধ্যে এক ঘন্টা সেখানে একই তারিখ দু'বার ঘটে) এবং সবসময় কালানুক্রমিকভাবে বাছাই করে না।
এখানে, আপনি ইউটিসি হতে হবে এবং ব্যবহার করতে বার বাধ্য করতে পারে perl
'র Date::Manip
মডিউল একটি উপায় যে বিভিন্ন প্রাকৃতিক ফরম্যাটের বুঝতে পারে তারিখ বিশ্লেষণ করতে:
(export TZ=UTC0 LC_ALL=C
ps -A -o lstart= -o pid= -o args= |
perl -MDate::Manip -lpe '
s/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e' |
sort
)
বা ksh93
যার সাহায্যে সেই তারিখের ফর্ম্যাটগুলিও স্বীকৃতি দেয়:
(export TZ=UTC0 LC_ALL=C
unset -v IFS
ps -A -o lstart= -o pid= -o args= |
while read -r a b c d e rest; do
printf '%(%FT%T+00:00)T %s\n' "$a $b $c $d $e" "$rest"
done
)
(সাবধান থাকুন এটি প্রতিটি লাইন থেকে ফাঁকা ফাঁকা স্ট্রিপগুলি)
বা সাথে zsh
এবং জিএনইউ date
:
(export LC_ALL=C TZ=UTC0
(){
paste -d '\0' <(cut -c1-24 < $1 | date -f- --iso-8601=s) \
<(cut -c25- < $1) | sort
} =(ps -A -o lstart= -o pid= -o args=)
)
বা শুধুমাত্র bash
(বা zsh
) লিনাক্সে এবং জিএনইউ সহ date
:
(export LC_ALL=C TZ=UTC0
{
paste -d '\0' <(cut -c1-24 | date -f- --iso-8601=s) \
<(cut -c25- < /dev/stdin) | sort
} <<< "$(ps -A -o lstart= -o pid= -o args=)"
)
এছাড়াও সাবধান যে প্রক্রিয়া শুরুর সময়টি শেষ বারের মতো একই নয় যে প্রক্রিয়াটি কোনও কমান্ড কার্যকর করেছিল কারণ প্রক্রিয়াগুলি সাধারণত তাদের জীবদ্দশায় একাধিক কমান্ড চালাতে পারে (যেগুলি সাধারণত এমন হয় না যা কখনই আদেশ দেয় না) । অন্য কথায়, এটি কমান্ড ( args
ক্ষেত্রের মান সমতুল্য cmd
) শুরু হওয়ার সাথে অগত্যা মেলেনি ।
$ sh -c 'sleep 4; exec sleep 123' & sleep 234 & sleep 5
[1] 9380
[2] 9381
$ (export TZ=UTC0 LC_ALL=C; ps -o lstart,pid,args | perl -MDate::Manip -lpe 's/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e')
2017-10-30T17:21:06+00:00 3071 zsh
2017-11-01T15:47:48+00:00 9380 sleep 123
2017-11-01T15:47:48+00:00 9381 sleep 234
কিভাবে দেখুন sleep 123
হিসাবে একই সময় হিসাবে শুরু হয়েছে দেখা যায় sleep 234
যদিও এটি 4 সেকেন্ড পরে শুরু হয়েছে। কারণ এটি কার্যকর করা হওয়ার আগে 9388 প্রক্রিয়াটি প্রাথমিকভাবে চলছিল sh
(এবং 4 সেকেন্ডের জন্য অপেক্ষা করছিল sleep 4
) sleep 123
এবং এটির আগে এটি zsh
আমার কোড ইন্টারেক্টিভ শেল দ্বারা কাঁটাযুক্ত কোড হিসাবে চলছিল , সুতরাং সেই প্রক্রিয়াটির জন্য সময় অনুযায়ী বিভিন্ন সময়ে, আপনার কাছে ps
আউটপুটটিতে দেখা : zsh
তারপর sh
, তারপর sleep
)।
এখানে উচ্চতর পারফরম্যান্স সহ একটি বাস্তবায়ন রয়েছে (প্রতি লাইনে নতুন প্রক্রিয়া চালানোর দরকার নেই):
ps -eo etimes,pid,args --sort=etimes | awk 'BEGIN{now=systime()} {$1=strftime("%Y-%m-%d %H:%M:%S", now-$1); print $0}'
এবং এটি কলাম ক্রমটিও খুব সহজে পরিবর্তন করতে দেয়। উদাহরণস্বরূপ pid
প্রথম এবং দ্বিতীয় কলাম হিসাবে সময় শুরু:
ps -eo pid,etimes,args --sort=etimes | awk 'BEGIN{now=systime()} {$2=strftime("%Y-%m-%d %H:%M:%S", now-$2); print $0}'
lstart
এমন একটি জঘন্য বিন্যাস আছে। এটি আরএফসি ২৮২২ এর কাছাকাছি কিন্তু শেষ বছর সহ।