Saya ingin menghindari melakukan ini dengan meluncurkan proses dari aplikasi pemantauan.
Di Linux dengan ps
dari procps(-ng)
(dan sebagian besar sistem lain karena ini ditentukan oleh POSIX):
ps -o etime= -p "$$"
Di mana $$
PID dari proses yang ingin Anda periksa. Ini akan mengembalikan waktu yang telah berlalu dalam format [[dd-]hh:]mm:ss
.
Menggunakan -o etime
memberitahu ps
bahwa Anda hanya ingin bidang waktu yang telah berlalu, dan =
pada akhir yang menekan header (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, ps
program mendapatkan ini dari /proc/$$/stat
, di mana salah satu bidang (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 boot (dari /proc/stat
), jumlah jiffies per detik pada sistem ini, dan kemudian lakukan perhitungan untuk mendapatkan waktu yang telah berlalu dalam format yang berguna.
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 sysconf()
fungsi posix , yang, sayangnya, menggunakan nilai kode-keras yang dikompilasi ke dalam perpustakaan C, atau C) bertanya pada kernel, tetapi tidak ada antarmuka resmi untuk melakukan itu. Jadi, ps
kode tersebut mencakup serangkaian kludges yang menentukan nilai yang benar. Wow.
Jadi nyaman untuk ps
melakukan itu semua untuk Anda. :)
Sebagai catatan pengguna @ 336_, di Linux (ini bukan portabel), Anda dapat menggunakan stat
perintah 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 itu $$
dimulai, dalam 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 itu date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"
akan berhasil, tetapi itu agak canggung. Satu keuntungan yang mungkin adalah bahwa jika Anda menggunakan output format panjang seperti -c%x
alih - alih -c%X
, Anda mendapatkan resolusi yang lebih besar daripada detik seluruh angka. Tetapi, jika Anda membutuhkannya, Anda mungkin harus menggunakan pendekatan audit proses karena waktu menjalankan perintah stat akan mengganggu keakuratan.
etime=
salah ketik? Saya hanya dapat menemukanetime
di halaman manual.=
menekan tajuk. Cobalah tanpa, atau cobaps -p $$ -o etime="Silly Header Here"
etimes
diri saya karena itu dapat dibaca mesinsysconf()
dan karena itu memberi Anda nilai kode dari perpustakaan C, seperti yang disebutkan, bukan?Portabel:
yaitu shell yang dimulai pada 30 Januari dan total sekitar 6 detik waktu CPU.
Mungkin ada cara yang lebih tepat atau lebih dapat diurai tetapi kurang portabel untuk mendapatkan informasi ini. Periksa dokumentasi
ps
perintah Anda atauproc
sistem file Anda .Di Linux, informasi ini tinggal di
/proc/$pid/stat
.Waktu CPU dalam jiffies; Saya tidak tahu bagaimana menemukan nilai jiffy dari shell. Waktu mulai relatif terhadap waktu boot (ditemukan dalam
/proc/uptime
).sumber
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 c library, atau c) meminta kernel, dan tidak ada antarmuka resmi untuk melakukan itu. Jadi, kode tersebut mencakup serangkaian kludges yang menentukan nilai yang benar. Wow.ps
manual menyatakan bahwatime
"waktu CPU kumulatif". Saya pikir apa yang dicari OP adalahetime
, atau "waktu yang berlalu sejak proses dimulai". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.htmletime
.X adalah nama prosesnya
sumber
ps -o pid,comm,cmd,start,etime -p X
untuk melihat PID X.ps
mengambil-o
opsi untuk menentukan format output, dan salah satu kolom yang tersedia adalahetime
. Menurut halaman manual:Dengan demikian Anda dapat menjalankan ini untuk mendapatkan PID dan waktu berlalu dari setiap proses:
Jika Anda ingin waktu yang telah berlalu dari PID tertentu (misalnya 12345), Anda dapat melakukan sesuatu seperti:
( Edit : Ternyata ada sintaks yang lebih pendek untuk perintah di atas; lihat jawaban mattdm )
sumber
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 menggunakannya
stat(1)
di shell, atau pengikatan yang sesuaistat(2)
dari $ favorite_programming_language, sehingga Anda bahkan mungkin tidak perlu meluncurkan proses eksternal.Perhatikan bahwa ini tidak berfungsi dengan
/usr/compat/linux/proc
di FreeBSD; waktu akses / modifikasi / perubahan status yang dikembalikan adalah waktu saat ini, dan waktu kelahiran adalah zaman UNIX. Cukup bodoh dukungannya tidak ada jika Anda bertanya kepada saya.sumber
stat /proc/4480
Ini akan memberi Anda tanggal Kelahiran, Ubah, Ubah dan Akses proses. Jika Anda memerlukan id proses, cukup gunakan "atas"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
sumber
Anda bisa mendapatkan waktu mulai proses dengan melihat
stat
file stat yang dihasilkan olehproc
, memformatnya menggunakandate
dan mengurangi dari waktu saat ini:echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))
di mana
13494
pid proses Andasumber
$ ps -eo lstart
dapatkan waktu mulai$ ps -eo etime
dapatkan durasi / waktu yang berlalu61819 adalah id proses.
sumber
Waktu berlalu dalam detik:
expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
sumber
date +%s --date="now - $( stat -c%X /proc/$$