iso tarih biçimi ile ps çıktı?


9

Bu çıktıyı lstart(işlem başlangıcı) göre sıralamak istiyorum :

ps -eo lstart,pid,cmd 

Lstart'ın YYYY-AA-GG SS: DD: SS gibi ISO biçiminde çıktı almanın bir yolu var mı?

Ancak tek başına sıralama sorunu çözmez. Gerçekten ISO tarih formatına sahip olmak istiyorum.


Neden lstartböyle garip bir biçime sahip. RFC 2822 yakın ama yıl sonunda.
vaughan

Yanıtlar:


10

lstartISO formatında çıktı almanın bir yolu var mı YYYY-MM-DD HH:MM:SS?

İle awk+ dateişbirliği:

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 }'

Ps etimes anahtar kelimesini kullanan alternatif yaklaşım (işlemin başlamasından bu yana geçen süre, saniye cinsinden):

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- geçerli zaman damgası ve elapsedzaman arasındaki fark , sürecin zaman damgası değerini verecektir

2
Daha kolay bir yolu yok mu?
guettli

3
etimesBunun yerine ps biçimini kullanırsanız lstart, geçen süreyi saniyeler içinde elde etmek biraz daha kolaydır date -d -999seconds.
meuh

@meuh, evet, bu biraz daha kısa olurdu, bir güncelleme yaptım
RomanPerekhrest

@guettli, daha kolay çağıramazsın, ama biraz daha kısa yolun var
RomanPerekhrest

4

Şuna göre sıralayabilirsiniz:

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

Teşekkürler, sorumu uzattım. İso tarih formatını da istiyorum.
guettli

2

Bunun lstartstandart Unix pssütunlarından biri olmadığını unutmayın .

Tüm sistemlerde bir sistem yoktur ve çıktı uygulamalar arasında ve potansiyel olarak yerel ayarlar arasında değişir.

Örneğin, FreeBSD'ye veya psgelen procps-ngve (genellikle olmayan gömülü sistemler, Linux tabanlı bulunan gibi) Cyerel ayarı elde edersiniz:

Wed Nov  1 12:36:15 2017

MacOS'ta:

Wed  1 Nov 12:36:15 2017

Ayrıca, size GMT ofsetini vermediğinden, çıktı DST'yi uygulayan zaman dilimlerinde belirsizdir (aynı tarihlerin iki kez meydana geldiği yıl boyunca bir saat vardır) ve her zaman kronolojik olarak sıralanmaz.

Burada, UTC olmak ve kullanımı kez zorlayacağını perl'ın Date::Manipfarklı doğal biçimleri anlayacağı şekilde tarih ayrıştırmak modülü:

(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
)

Veya ksh93bu tarih biçimlerini de tanır:

(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
)

(her satırdaki boşlukları kapatmasına dikkat edin)

Veya zshGNU ile 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=)
)

Veya yalnızca Linux'ta ve GNU ile bash(veya 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=)"
)

Ayrıca, işlemin başlama zamanının işlemin bir komutu yürüttüğü son seferle aynı olması gerekmediğine dikkat edin, çünkü işlemler genellikle kullanım ömürleri boyunca birden fazla komut çalıştırabilir (genellikle hiç komut yürütmeyenler) . Başka bir deyişle, komutun ( argsalan, standart eşdeğeri cmd) başlatıldığı zamana karşılık gelmez .

$ 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

Bakın nasıl sleep 123aynı anda başlamıştır sahip olarak görülüyor sleep 234o 4 saniye sonra başlandı bile. Bunun nedeni, 9388 işleminin yürütülmeden önce başlangıçta çalışması sh(ve 4 saniye beklemesidir sleep 4) sleep 123ve bundan önce zshinteraktif kabuğum tarafından çatallandığı için kod çalıştırmasıydı , bu nedenle zaman içinde farklı süreçlerde, psçıktıda görülen :, zshsonra sh, sonra sleep).


1
Cevabınız için teşekkür ederim. Şimdi öncekinden daha fazla sorum var. Kolay ve basit bir çözüm olduğunu düşündüm.
guettli

1

İşte daha yüksek performansa sahip bir uygulama (her satıra yeni bir işlem yürütmesi gerekmez):

ps -eo etimes,pid,args --sort=etimes | awk 'BEGIN{now=systime()} {$1=strftime("%Y-%m-%d %H:%M:%S", now-$1); print $0}'

bu da sütun sırasını kolayca değiştirmenizi sağlar. Örneğin pid, ikinci sütun olarak ilk ve başlangıç ​​saati:

ps -eo pid,etimes,args --sort=etimes | awk 'BEGIN{now=systime()} {$2=strftime("%Y-%m-%d %H:%M:%S", now-$2); print $0}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.