Yanıtlar:
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 verecektiretimesBunun yerine ps biçimini kullanırsanız lstart, geçen süreyi saniyeler içinde elde etmek biraz daha kolaydır date -d -999seconds.
Şuna göre sıralayabilirsiniz:
ps -eo lstart,pid,cmd --sort=start_time
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).
İş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}'
lstartböyle garip bir biçime sahip. RFC 2822 yakın ama yıl sonunda.