উত্তর:
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এমন একটি জঘন্য বিন্যাস আছে। এটি আরএফসি ২৮২২ এর কাছাকাছি কিন্তু শেষ বছর সহ।