Yanıtlar:
İle Linux'ta ps
gelen procps(-ng)
(ve çoğu diğer sistemler bu yana POSIX tarafından belirtilir):
ps -o etime= -p "$$"
$$
Kontrol etmek istediğiniz işlemin PID'si nerede . Bu, geçen süreyi biçiminde döndürür [[dd-]hh:]mm:ss
.
Kullanılması -o etime
söyler ps
sadece geçen süre alanını istiyoruz ve bu =
o sonunda başlığını bastırır (, bir diyor hat almak olmaksızın ELAPSED
sonra ve sonraki satırda zaman; bu anlamda zamanla sadece bir satır olsun birlikte) .
Veya, Linux'ta veya FreeBSD 9.0 veya daha üstündeki (ve muhtemelen diğerlerinde) işlem takım paketinin (3.3.0 veya üzeri) daha yeni sürümleriyle şunları kullanın:
ps -o etimes= -p "$$"
(bir ekleme ile s
) zamanın sadece saniye olarak biçimlendirilmesi için, bu komut dosyalarında daha kullanışlıdır.
Linux'ta, ps
program bunu /proc/$$/stat
alanlardan birinin (bkz. man proc
) Sürecin başlangıç zamanı olduğu yerden alır . Bu ne yazık ki, sistemin önyüklemesinden bu yana jiffy'ler (Linux çekirdeğinde kullanılan keyfi bir zaman sayacı) zamanı olarak belirtiliyor. Böylece, sistemin önyükleme zamanını (itibaren /proc/stat
), bu sistemde saniye başına düşen jiff sayısını belirlemeli ve sonra geçen zamanı yararlı bir biçimde almak için matematiği yapmalısınız.
HZ'nin değerini bulmak için saçma bir şekilde karmaşık olduğu ortaya çıkıyor (saniyede jiffies). Yorumlarla kaynaktan sysinfo.c
PROCPS paketinde bir A), farklı bir çekirdek kullanıldığında, B) posix kullanmak çekirdek başlık dosyası içerir ve yeniden derlemek için sysconf()
, ne yazık ki, C kütüphanesi derlenmiş, kodlanmış bir değer kullanır fonksiyonu, ya da C) çekirdeğe sorun, ancak bunu yapacak resmi bir arayüz yok. Bu nedenle, ps
kod doğru değeri belirlediği bir dizi tortu içerir. Vay.
Bu yüzden ps
bütün bunları sizin için yapar. :)
Kullanıcı @ 336_'nın belirttiği gibi, Linux'ta (bu taşınabilir değildir), stat
dizinin erişimine, değiştirilmesine veya durum değişikliği tarihlerine bakmak için bu komutu kullanabilirsiniz /proc/$$
(yine $$
ilgili işlemdir). Üç sayının da aynı olması gerekir,
stat -c%X /proc/$$
o $$
dönemin başlamasından bu yana saniyeler içinde , sürecin başladığı zamanı size verecek . Bu hala istediğin gibi değil, çünkü şu andaki zamandan geçen zamanı çıkarmak için matematiği yapman gerekiyor - sanırım date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"
işe yarayacak bir şey işe yaramaz, ama biraz ungainly. Bir olası avantajı gibi uzun formatlı çıkışını kullanırsanız olmasıdır -c%x
yerine -c%X
, tüm-sayı saniyeden büyük çözünürlük elde edersiniz. Ancak, buna ihtiyacınız olursa, muhtemelen muhtemelen işlem denetimi yaklaşımını kullanmalısınız, çünkü stat komutunu çalıştırma zamanlaması doğruluk ile etkileşime girecektir.
=
başlık bastırır. Olmadan deneyin ya da deneyinps -p $$ -o etime="Silly Header Here"
etimes
ediyorum o zaman makine okunabilir
sysconf()
ve bu nedenle size belirtildiği gibi C kütüphanesinden kodlanmış değeri verir, değil mi?
Taşınabilir:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
yani, bu kabuk 30 Ocak'ta başlamış ve yaklaşık 6 saniye CPU zamanı toplamı olmuştur.
Bu bilgiyi elde etmek için daha kesin veya daha ayrılabilir fakat daha az taşınabilir yollar olabilir. ps
Komutunuzun veya proc
dosya sisteminizin belgelerini kontrol edin .
Linux altında, bu bilgi yaşıyor /proc/$pid/stat
.
awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat
CPU zamanı jiffies; Jiffy değerini kabuğundan nasıl bulacağımı bilmiyorum. Başlangıç saati, başlangıç saatine göre bulunur (bulunur /proc/uptime
).
sysinfo.c
Procps paketindeki yorumlardan bir tanesi a) çekirdek başlık dosyasını içerir (ve farklı bir çekirdek kullanılıyorsa yeniden derleyin, b) maalesef, derlenmiş bir kodlanmış değeri kullanan posix sysconf () işlevini kullanın c kütüphanesi ya da c) çekirdeğe sorun ve bunun için resmi bir arayüz yok. Bu nedenle, kod doğru değeri belirlediği bir dizi tortu içerir. Vay.
ps
Manpage devletler time
"kümülatif CPU süresi" dir. OP'nin aradığı şeyin etime
ya da "sürecin başlamasından bu yana geçen zaman" olduğunu düşünüyorum. pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
.
ps -eo pid,comm,cmd,start,etime | grep -i X
X işlemin adıdır
ps -o pid,comm,cmd,start,etime -p X
PID X'e bakmak için
ps
-o
çıktı biçimini belirtmek için bir seçenek alır ve mevcut sütunlardan biridir etime
. Man sayfasına göre:
etime - işlemin başlamasından bu yana geçen zaman, [[dd-] ss:] mm: ss biçiminde.
Böylece her işlemin PID ve geçen zamanını elde etmek için bunu çalıştırabilirsiniz:
$ ps -eo pid,etime
Belirli bir PID'in geçen süresini (örneğin, 12345) istiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
( Düzenleme : Yukarıdaki komut için daha kısa bir sözdizimi var; mattdm'nin cevabına bakınız )
Emin bu henüz önenlmemıştır neden: Linux üzerinde olabildiğince stat()
sizin PID için / proc / [nnn] dizin.
Bu davranış açıkça, çekirdeğin ilgili bilgileri kolayca kontrol edebileceği, yüksek çözünürlükte yapabileceği ve çekirdeğin jüri hackleri olmadan doğru bir şekilde yapabileceği, işlemin başlangıç zamanını döndürmek üzere tasarlanmıştır. Erişim, veri değiştirme ve durum değişikliği alanlarının tümü işlem başlangıç zamanını döndürür.
Hepsinden iyisi stat(1)
, kabuğunda veya stat(2)
$ favorite_programming_language öğesinden uygun bir bağlama kullanabilirsiniz , böylece harici bir işlem başlatmanıza gerek kalmayabilir.
NOT Bu olmadığını değil çalışmak /usr/compat/linux/proc
FreeBSD üzerinde; döndürülen erişim / değişiklik / durum-değişim zamanları şimdiki zamandır ve doğum zamanı UNIX dönemidir. Bana sorarsan destek aptal değil.
stat /proc/4480
Bu size işlemin Doğum, Değişim, Değiştirme ve Erişim tarihlerini verecektir. İşlem kimliğine ihtiyacınız varsa, sadece "top" kullanın
Zaman çalıştırabilir ve sonra bir komutu çalıştırabilirseniz tam olarak aradığınızı elde edersiniz. Zaten çalışan bir komuta karşı bunu yapamazsınız.
[0]% zaman uykusu 20
uyku 20 0,00 sn kullanıcı 0,00 sn sistem% 0 cpu 20,014 toplam
$ ps -eo lstart
başlangıç zamanı
$ ps -eo etime
süre / geçen süre
$ ps -eo pid,lstart,etime | grep 61819
PID STARTED ELAPSED
61819 Mon Sep 17 03:01:35 2018 07:52:15
61819, işlem kimliğidir.
Saniye cinsinden geçen süre: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
bir yazım hatası? Sadeceetime
man sayfalarında bulabilirim .