Yanıtlar:
lstart
ISO formatında çıktı almanın bir yolu var mıYYYY-MM-DD HH:MM:SS
?
İle awk
+ date
iş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 elapsed
zaman arasındaki fark , sürecin zaman damgası değerini verecektiretimes
Bunun 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 lstart
standart Unix ps
sü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 ps
gelen procps-ng
ve (genellikle olmayan gömülü sistemler, Linux tabanlı bulunan gibi) C
yerel 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::Manip
farklı 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 ksh93
bu 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 zsh
GNU 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 ( args
alan, 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 123
aynı anda başlamıştır sahip olarak görülüyor sleep 234
o 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 123
ve bundan önce zsh
interaktif 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 :, zsh
sonra 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}'
lstart
böyle garip bir biçime sahip. RFC 2822 yakın ama yıl sonunda.