Saya ingin menghindari melakukan ini dengan meluncurkan proses dari aplikasi pemantauan.
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.
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
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 )
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.
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
$ 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.
Waktu berlalu dalam detik: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
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