Jawaban:
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.
=
menekan tajuk. Cobalah tanpa, atau cobaps -p $$ -o etime="Silly Header Here"
etimes
diri saya karena itu dapat dibaca mesin
sysconf()
dan karena itu memberi Anda nilai kode dari perpustakaan C, seperti yang disebutkan, bukan?
Portabel:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
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 atau proc
sistem file 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 jiffies; Saya tidak tahu bagaimana menemukan nilai jiffy dari shell. Waktu mulai relatif terhadap waktu boot (ditemukan dalam /proc/uptime
).
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 bahwa time
"waktu CPU kumulatif". Saya pikir apa yang dicari OP adalah etime
, atau "waktu yang berlalu sejak proses dimulai". pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
.
ps -eo pid,comm,cmd,start,etime | grep -i X
X adalah nama prosesnya
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 adalah etime
. Menurut halaman manual:
etime - waktu yang 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 (misalnya 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 menggunakannya stat(1)
di shell, atau pengikatan yang sesuai stat(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.
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
Anda bisa mendapatkan waktu mulai proses dengan melihat stat
file stat yang dihasilkan oleh proc
, memformatnya menggunakan date
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 Anda
$ 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>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
salah ketik? Saya hanya dapat menemukanetime
di halaman manual.