जवाबों:
क्या
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कॉलम में से एक नहीं है ।
सभी प्रणालियों में एक नहीं है, और आउटपुट कार्यान्वयन और स्थानों के बीच संभावित रूप से भिन्न होता है।
उदाहरण के लिए, FreeBSD पर या psसे procps-ng(जैसा कि आमतौर पर गैर-एम्बेडेड लिनक्स-आधारित सिस्टम पर पाया जाता है) और Cस्थान के साथ, आप निम्न करेंगे:
Wed Nov 1 12:36:15 2017
MacOS पर:
Wed 1 Nov 12:36:15 2017
इसके अलावा, चूंकि, यह आपको GMT ऑफसेट नहीं देता है, आउटपुट टाइमज़ोन में अस्पष्ट है जो DST को लागू करता है (जहां वर्ष के दौरान एक घंटे होता है जहां एक ही तारीख दो बार होती है) और हमेशा कालानुक्रमिक क्रमबद्ध न करें।
यहाँ, आप यूटीसी हो सकता है और उपयोग करने के लिए कई बार के लिए मजबूर कर सकता है 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
)
(सावधान रहें कि यह प्रत्येक लाइन से खाली ट्रेल्स स्ट्रिप्स है)
या zshGNU के साथ 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=)
)
या केवल लिनक्स पर और GNU के साथ 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इस तरह के एक अजीब प्रारूप है। RFC 2822 के करीब है, लेकिन साल के अंत में।