Linux işleminin çalışma süresi nasıl bulunur?


69

Belirli bir linux işleminin çalışma süresini nasıl bulurum.

ps aux | grep gedit | grep -v grep

bana sürecin başladığı zamanı içeren çok fazla bilgi veriyor. Özellikle bir işlemin çalışma süresini milisaniye cinsinden döndüren anahtarı arıyorum.

Teşekkürler

Yanıtlar:


113

"Çalışma süresi" nin çeşitli anlamları olduğu için, burada yararlı bir komut var.

ps -eo pid,comm,lstart,etime,time,args

Bu komut, tüm işlemleri zamana bağlı birkaç farklı sütuna sahip listeler. Aşağıdaki sütunlara sahiptir:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID=
Önce işlem kimliği COMMAND= yalnızca seçenek ve bağımsız değişkenler olmadan komut adı
STARTED= işlemin başlatıldığı mutlak süre = işlemin başlatılmasından
ELAPSEDbu yana geçen süre ( duvar saati zamanı ), biçim [[dd-] ss:] mm: ss TIME= kümülatif CPU zamanı, "[dd-] ss: dd: ss" formatı
ikinci COMMAND= tekrar komut, bu sefer sunulan tüm seçenek ve argümanlarla


1
Güzel. Kendimi tercih etimesediyorum - saniye cinsinden geçen süre - bu yüzden makine okunabilir durumda
Asfand Qazi

1
soru içinde istatistik zamanı gelmişti milisaniye
yohann.martineau

maalesef busybox 1.29.3 etime formatını kırdı, bu yüzden ayrıştırma için ona güvenmeyin.
Danny Dulai

10

İçinde bulunduğu psgibi sınırlı bir süreniz varsa busybox, işlemin başlangıç ​​zamanını zaman damgasına bakarak alabilirsiniz /proc/<PID>. Örneğin, bakmak istediğiniz çare 55 ise ...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

... ve ardından geçerli tarihle karşılaştırın ...

# date
Thu May 22 03:00:47 EDT 2014

Bu artık mevcut çekirdekler üzerinde çalışmaz.
goertzenator

7

Sadece kaçabileceğini düşünüyorum:

$ stat /proc/1234

1234 işlem kimliğidir.

örnek iki işlemle aynı saatte başladı, aynı milisaniyede değil:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

4

Böyle basit bir şey 5 yıl sonra doğru cevaplanmadı mı?

Milisaniyeyi tam olarak alabileceğinizi sanmıyorum. Örneğin. hangi alanın 22'nin başlangıç ​​zamanı olduğunu görüyorsanız man procfsve görüyorsanız /proc/$$/stat, hangisi “saat keneleri” nde ise, daha kesin bir şey elde edersiniz, ancak saat keneleri tam olarak sabit bir hızda gitmez ('duvar saati zamanına göre) ve kapalı ol ... uyumaya ve bazı şeyler (ntpd sanırım) ofset. Örneğin ntpd çalıştıran ve 8 gün çalışma süresi olan ve hiç uyumayan bir makinede dmesg -Taynı problem var (sanırım ...) ve burada görebilirsiniz:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

İşte saniye:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

3

evet, çok yaşlı ve çok zor şeyler. Yukarıda önerilen "stat" yöntemini denedim ama pid proc dir dün "dokunma" olsaydı ne olurdu? Bu, benim eski sürecimin dünün zaman damgasıyla gösterildiği anlamına geliyor. Hayır, ihtiyacım olanı değil :(

Yenilerde, basit:

ps -o etimes -p <PID>
ELAPSED
339521

kadar basit. Zaman saniye cinsinden mevcuttur. Ne için istersen yap. Bazı eski kutularda, hiç sorun olmadığı için durum daha zor. Biri güvenebilirdi:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

dd-hh: mm: ss biçiminde olduğundan "biraz" garip görünüyor. Daha fazla hesaplama için uygun değildir. Saniyeler içinde tercih ederdim, bu yüzden bunu kullandım:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544

Bu, eski sistemlerde bunu yapmanın gerçekten güzel bir yolu, teşekkürler :)
RobotJohnny 11:18

etime çıktısını çözümlemeyin çünkü busybox 1.29.3 formatı değiştirdi. stat + / proc yöntemini kullanın
Danny Dulai 5:18

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => Java işlemi için işlem kimliği

etimes= => Saniye cinsinden süre ve '=' başlığı kaldırılıyor

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.