iso दिनांक स्वरूप के साथ ps आउटपुट?


9

मैं इस आउटपुट lstartको प्रक्रिया की शुरुआत के आधार पर क्रमबद्ध करना चाहूंगा :

ps -eo lstart,pid,cmd 

एम एम: वहाँ YYYY-MM-YYY HH तरह ISO प्रारूप में उत्पादन lstart का कोई तरीका है एसएस?

लेकिन अकेले छांटने से इसका हल नहीं निकलता। मैं वास्तव में आईएसओ तिथि प्रारूप रखना चाहूंगा।


क्यों lstartइस तरह के एक अजीब प्रारूप है। RFC 2822 के करीब है, लेकिन साल के अंत में।
वघन

जवाबों:


10

क्या 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समय के बीच अंतर , प्रक्रिया की टाइमस्टैम्प मूल्य देगा

2
क्या कोई आसान तरीका नहीं है?
गुएतली

3
आप ps प्रारूप का उपयोग करते हैं etimes, के बजाय lstartआप सेकंड में व्यतीत समय जो थोड़ा आसान में पारित करने के लिए है मिलता है date -d -999seconds
meuh

@meuh, हाँ, यह थोड़ा कम होगा, मैंने एक अद्यतन किया है
RomanPerekhrest

@guettli, इसे आसान नहीं कह सकते, लेकिन आपको थोड़ा सा रास्ता मिल गया
RomanPerekhrest

4

आप इसके साथ सॉर्ट कर सकते हैं:

ps -eo lstart,pid,cmd --sort=start_time

धन्यवाद, मैंने अपना प्रश्न बढ़ाया। मैं आईएसओ तिथि प्रारूप भी चाहता हूं।
गुएटली

2

ध्यान दें कि 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)।


1
आपके उत्तर के लिए धन्यवाद। अब मेरे पास पहले से ज्यादा सवाल हैं। मैंने सोचा कि एक आसान और सरल उपाय है।
13

1

यहां उच्च प्रदर्शन के साथ कार्यान्वयन है (प्रति पंक्ति एक नई प्रक्रिया को निष्पादित करने की आवश्यकता नहीं है):

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}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.