Bir işlemin ne kadar süredir devam ettiğini nasıl kontrol edebilirim?


243

Süreci bir izleme uygulamasından başlatarak bunu yapmaktan kaçınmak istiyorum.

Yanıtlar:


311

İle Linux'ta psgelen 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 etimesöyler pssadece geçen süre alanını istiyoruz ve bu =o sonunda başlığını bastırır (, bir diyor hat almak olmaksızın ELAPSEDsonra 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, psprogram bunu /proc/$$/statalanlardan 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.cPROCPS 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, pskod doğru değeri belirlediği bir dizi tortu içerir. Vay.

Bu yüzden psbütün bunları sizin için yapar. :)

Kullanıcı @ 336_'nın belirttiği gibi, Linux'ta (bu taşınabilir değildir), statdizinin 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%xyerine -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.


1
Selam! Mı etime=bir yazım hatası? Sadece etimeman sayfalarında bulabilirim .
Kent Pawar

16
@KentPawar Bu bir yazım hatası değil. Boş =başlık bastırır. Olmadan deneyin ya da deneyinps -p $$ -o etime="Silly Header Here"
mattdm 13

4
ps -p $ (pgrep bulma) -o etime =
mafroz

1
Güzel. Kendimi tercih etimesediyorum o zaman makine okunabilir
Asfand Qazi

1
@alexmurray Bu sadece sizi çağırır sysconf()ve bu nedenle size belirtildiği gibi C kütüphanesinden kodlanmış değeri verir, değil mi?
mattdm

36

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. psKomutunuzun veya procdosya 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).


3
HZ'nin değerini bulmak (yani saniyedeki jiffies) gülünç bir şekilde karmaşık hale geldi! sysinfo.cProcps 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.
mattdm

1
psManpage devletler time"kümülatif CPU süresi" dir. OP'nin aradığı şeyin etimeya da "sürecin başlamasından bu yana geçen zaman" olduğunu düşünüyorum. pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
Ne de olsa "taşınabilir" değil: "ps: stime: anahtar kelime FreeBSD'de bulunamadı" . Yine de en azından destekliyor etime.
n.st

18
ps -eo pid,comm,cmd,start,etime | grep -i X

X işlemin adıdır


2
muhtemelen bir grep -v grep eklemelisiniz.
Brian

ps -o pid,comm,cmd,start,etime -p XPID X'e bakmak için
codeforester

13

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 )


5

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/procFreeBSD ü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 çıktısında bilgiyi nerede görüyorum? Sadece Access, Modify ve Change'i görüyorum.
tshepang

@Tshepang Bu değerlerin hepsinin aynı olduğunu ve işlem başlangıç ​​zamanı olduklarını unutmayın . Yine de matematiği yapmak zorundasın, ama bu kesinlikle cevabımda yazdığı gibi jiffleri bulmaya çalışmaktan daha iyi.
mattdm

Buna şöyle diyorsunuz: stat /proc/4480Bu 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
user890332

2

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


Devam eden bir süreç izlemesinde bitene kadar nasıl yapabilirim biliyor musunuz?
lrkwz

1

Sürecin başlangıç ​​zamanını, statürettiği stat dosyasına bakarak, prockullanarak formatlayabilir dateve güncel zamandan çıkarabilirsiniz:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494sürecin neresi?


1

$ 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.


Lstart kullanımı sorunlu olabilir, çarpıktır - unix.stackexchange.com/questions/274610/…
slm

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.