it-swarm-id.com

Bagaimana cara memeriksa berapa lama proses telah berjalan?

Saya ingin menghindari melakukan ini dengan meluncurkan proses dari aplikasi pemantauan.

250
tshepang

Di Linux dengan ps from procps(-ng) (dan sebagian besar sistem lainnya karena ini ditentukan oleh POSIX):

ps -o etime= -p "$$" 

Di mana $$ Adalah PID dari proses yang ingin Anda periksa. Ini akan mengembalikan waktu yang telah berlalu dalam format [[dd-]hh:]mm:ss.

Menggunakan -o etime Memberi tahu ps bahwa Anda hanya ingin bidang waktu yang berlalu, dan = Di akhir yang menekan tajuk (tanpa, Anda mendapatkan garis yang mengatakan ELAPSED dan kemudian waktu di baris berikutnya; dengan, Anda hanya mendapatkan satu baris dengan waktu).

Atau, dengan versi yang lebih baru dari paket alat procps-ng (3.3.0 atau lebih tinggi) di Linux atau FreeBSD 9.0 atau lebih tinggi (dan mungkin yang lain), gunakan:

ps -o etimes= -p "$$"

(dengan tambahan s) untuk mendapatkan waktu yang diformat seperti detik, yang lebih berguna dalam skrip.

Di Linux, program ps mendapatkan ini dari /proc/$$/stat, Di mana salah satu isian (lihat man proc) Adalah waktu mulai proses. Sayangnya, ini ditentukan sebagai waktu dalam jiffies (penghitung waktu sewenang-wenang yang digunakan dalam kernel Linux) sejak sistem boot. Jadi, Anda harus menentukan waktu di mana sistem melakukan boot (dari /proc/stat), Jumlah jiffies per detik pada sistem ini, dan kemudian melakukan matematika untuk mendapatkan waktu yang telah berlalu dalam format yang bermanfaat.

Ternyata menjadi sangat rumit untuk menemukan nilai HZ (yaitu, jiffies per detik). Dari komentar di sysinfo.c Dalam paket procps, seseorang dapat A) memasukkan file header kernel dan mengkompilasi ulang jika kernel yang berbeda digunakan, B) menggunakan fungsi posix sysconf(), yang, sayangnya, menggunakan nilai kode yang dikompilasi ke dalam pustaka C, atau C) meminta kernel, tetapi tidak ada antarmuka resmi untuk melakukan itu. Jadi, kode ps mencakup serangkaian kludges yang menentukan nilai yang benar. Wow.

Jadi nyaman bahwa ps melakukan semuanya untuk Anda. :)

Sebagai catatan pengguna @ 336_, di Linux (ini bukan portabel), Anda dapat menggunakan perintah stat untuk melihat tanggal akses, modifikasi, atau perubahan status untuk direktori /proc/$$ (Di mana lagi $$ Adalah proses yang menarik). Ketiga angka harus sama, jadi

stat -c%X /proc/$$

akan memberi Anda waktu proses $$ dimulai, dalam beberapa detik sejak Zaman. Itu masih tidak seperti yang Anda inginkan, karena Anda masih perlu melakukan matematika untuk mengurangi itu dari waktu saat ini untuk mendapatkan waktu yang telah berlalu - saya kira sesuatu seperti date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" akan bekerja, tetapi agak canggung. Satu --- mungkin keuntungan adalah jika Anda menggunakan output format panjang seperti -c%x Alih-alih -c%X, Anda mendapatkan resolusi lebih besar daripada detik-detik seluruh-angka. Tetapi, jika Anda membutuhkannya, Anda mungkin harus menggunakan pendekatan audit proses karena waktu menjalankan perintah stat akan mengganggu akurasi.

324
mattdm

Portabel:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

yaitu bahwa Shell dimulai pada 30 Januari dan totalnya sekitar 6 detik waktu CPU.

Mungkin ada cara yang lebih tepat atau lebih dapat diurai tetapi kurang portabel untuk mendapatkan informasi ini. Periksa dokumentasi dari sistem file ps Anda atau proc Anda.

Di Linux, informasi ini tinggal di /proc/$pid/stat .

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

Waktu CPU dalam sekejap; Saya tidak tahu bagaimana menemukan nilai Jiffy dari Shell. Waktu mulai relatif terhadap waktu boot (ditemukan dalam /proc/uptime).

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

X adalah nama prosesnya

19
mezi

ps mengambil -o pilihan untuk menentukan format output, dan salah satu kolom yang tersedia adalah etime. Menurut halaman manual:

etime - waktu berlalu sejak proses dimulai, dalam bentuk [[dd-] jj:] mm: dd.

Dengan demikian Anda dapat menjalankan ini untuk mendapatkan PID dan waktu berlalu dari setiap proses:

$ ps -eo pid,etime

Jika Anda ingin waktu yang telah berlalu dari PID tertentu (mis. 12345), Anda dapat melakukan sesuatu seperti:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( Edit : Ternyata ada sintaks yang lebih pendek untuk perintah di atas; lihat jawaban mattdm )

13
Michael Mrozek

Tidak yakin mengapa ini belum disarankan: di Linux Anda dapat stat() direktori/proc/[nnn] untuk PID Anda.

Perilaku ini secara eksplisit dirancang untuk mengembalikan waktu mulai proses, yang dapat dilakukan pada resolusi tinggi, dan yang dapat dilakukan kernel secara akurat tanpa jiffies hack karena kernel dapat (jelas) hanya memeriksa informasi yang relevan. Bidang akses, modifikasi data, dan perubahan status semuanya mengembalikan waktu mulai proses.

Yang terbaik dari semuanya, Anda dapat menggunakan stat(1) di Shell, atau pengikatan yang sesuai ke stat(2) dari $ favorite_programming_language, sehingga Anda bahkan mungkin tidak perlu meluncurkan proses eksternal.

NOTE bahwa ini tidak tidak bekerja dengan /usr/compat/linux/proc di FreeBSD; waktu akses/modifikasi/perubahan status yang dikembalikan adalah waktu saat ini, dan waktu kelahiran adalah UNIX Epoch. Cukup bodoh dukungannya tidak ada jika Anda bertanya kepada saya.

5
i336_

Jika Anda dapat menjalankan waktu dan kemudian menjalankan perintah, Anda akan mendapatkan apa yang Anda cari. Anda tidak dapat melakukan ini terhadap perintah yang sudah berjalan.

[0]% waktu tidur 20

sleep 20 0,00s pengguna 0,00s sistem 0% cpu 20.014 total

2
slashdot

$ ps -eo lstart dapatkan waktu mulai

$ ps -eo etime dapatkan durasi/waktu yang berlalu

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 adalah id proses.

2
Terry wang

Waktu berlalu dalam detik: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
Shardj

anda bisa mendapatkan waktu mulai proses dengan melihat stat dari file stat yang diproduksi oleh proc, memformatnya menggunakan date dan mengurangi dari waktu sekarang:

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

dimana 13494 adalah pid proses Anda

1
bobbins