जवाबों:
क्या
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
)
(सावधान रहें कि यह प्रत्येक लाइन से खाली ट्रेल्स स्ट्रिप्स है)
या zsh
GNU के साथ 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 के करीब है, लेकिन साल के अंत में।