Bagaimana menemukan uptime dari proses linux

69

Bagaimana cara menemukan uptime dari proses linux yang diberikan.

ps aux | grep gedit | grep -v grep

memberi saya banyak informasi yang mencakup waktu di mana proses dimulai. Saya secara khusus mencari saklar yang mengembalikan waktu proses dalam milidetik.

Terima kasih

Mahadevan Sreenivasan
sumber

Jawaban:

113

Karena "uptime" memiliki beberapa arti, berikut ini adalah perintah yang berguna.

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

Perintah ini mencantumkan semua proses dengan beberapa kolom terkait waktu yang berbeda. Ini memiliki kolom berikut:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= ID proses
pertama COMMAND= hanya nama perintah tanpa opsi dan tanpa argumen
STARTED= waktu absolut proses dimulai
ELAPSED= waktu berlalu sejak proses dimulai ( waktu jam dinding ), format [[dd-] hh:] mm: ss TIME= kumulatif Waktu CPU, "[dd-] jj: mm: dd" format
detik COMMAND= lagi perintah, kali ini dengan semua opsi dan argumen yang disediakan

Abdull
sumber
1
Bagus. Saya lebih suka etimesdiri saya sendiri - waktu berlalu dalam hitungan detik - jadi itu bisa dibaca mesin
Asfand Qazi
1
pertanyaannya adalah tentang waktu stat dalam milidetik
yohann.martineau
sayangnya, busybox 1.29.3 memecah format untuk etime, jadi jangan bergantung padanya untuk penguraian.
Danny Dulai
10

Jika Anda memiliki versi terbatas psseperti yang ditemukan di busybox, Anda bisa mendapatkan waktu mulai proses dengan melihat stempel waktu /proc/<PID>. Misalnya, jika pid yang ingin Anda lihat adalah 55 ...

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

... lalu bandingkan dengan tanggal saat ini ...

# date
Thu May 22 03:00:47 EDT 2014
goertzenator
sumber
1
Ini sepertinya tidak lagi berfungsi pada kernel saat ini.
goertzenator
7

Saya pikir Anda bisa menjalankan:

$ stat /proc/1234

1234 menjadi id proses.

contoh dengan dua proses dimulai pada jam menit menit yang sama tetapi tidak milidetik yang sama:

$ 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
yohann.martineau
sumber
4

Hal sederhana seperti itu tidak dijawab dengan benar setelah 5 tahun?

Saya tidak berpikir Anda bisa mendapatkan milidetik secara akurat. misalnya. jika Anda melihat man procfsdan melihat /proc/$$/statyang memiliki bidang 22 sebagai waktu mulai, yang ada di "kutu jam", Anda akan memiliki sesuatu yang lebih tepat, tetapi kutu jam tidak akan berada pada tingkat yang konstan sempurna (relatif terhadap 'waktu jam dinding') dan akan pergi ... tidur dan hal-hal tertentu (ntpd kurasa) mengimbanginya. Misalnya pada mesin yang menjalankan ntpd, dengan uptime 8 hari dan tidak pernah tidur, dmesg -Tmemiliki masalah yang sama (saya pikir ...), dan Anda dapat melihatnya di sini:

# 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

Inilah detik:

# 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"
Peter
sumber
3

ya, terlalu tua dan terlalu sulit. Saya mencoba dengan metode "stat" yang diusulkan di atas, tetapi bagaimana jika saya "menyentuh" ​​-dengan direktori PID kemarin? Ini berarti proses saya yang berumur satu tahun ditunjukkan dengan cap waktu kemarin. Nah, bukan itu yang saya butuhkan :(

Di yang lebih baru, sederhana:

ps -o etimes -p <PID>
ELAPSED
339521

sesimpel itu. Waktu hadir dalam detik. Lakukan apa pun yang Anda butuhkan. Dengan beberapa kotak yang lebih tua, situasinya lebih sulit, karena tidak ada waktu luang. Orang bisa mengandalkan:

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

yang terlihat "sedikit" aneh karena dalam format dd-hh: mm: ss. Tidak cocok untuk perhitungan lebih lanjut. Saya lebih suka dalam hitungan detik, jadi saya menggunakan yang ini:

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
George Ivanov
sumber
Ini adalah cara yang sangat baik untuk melakukannya pada sistem yang lebih lama, terima kasih :)
RobotJohnny
jangan parsing output etime karena busybox 1.29.3 mengubah format. gunakan metode stat + / proc sebagai gantinya
Danny Dulai
-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => id proses untuk proses java

etimes= => waktu dalam Detik dan '=' adalah untuk menghapus header

Rohit
sumber