Bagaimana cara mendapatkan waktu mulai dari proses Linux yang sudah berjalan lama? [Tutup]

250

Apakah mungkin untuk mendapatkan waktu mulai dari proses yang berjalan lama? Tampaknya psakan melaporkan tanggal (bukan waktu) jika tidak dimulai hari ini, dan hanya tahun jika tidak dimulai tahun ini. Apakah presisi hilang selamanya untuk proses lama?

ajwood
sumber
16
Apakah ada yang salah dengan menggunakan ps -p <pid> -o lstart? Sepertinya itu berhasil, tapi saya tidak yakin mengapa itu bukan jawaban yang jelas dan segera untuk pertanyaan yang sering muncul.
ajwood
7
@ Kayu Akan lebih baik digunakan ps -p <pid> -o lstart=untuk menghindari baris tambahan (header) yang akan dicetak.
Vladimir Protasov
2
Apakah ada yang salah dengan menggunakan ps -p <pid> -o lstart? Mungkin faktanya tidak ada lstartbaik dalam Edisi 2004 atau pada edisi 2013 standar POSIX 1003.1?
Piotr Dobrogost
5
@PiotrDobrogost, itu akan menjadi masalah jika pertanyaannya tentang POSIX, tetapi menanyakan tentang Linux.
womble
4
Mod - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - mengapa Anda tidak memindahkannya ke situs yang lebih tepat seperti StackExchange atau Superuser alih-alih menutup pertanyaan? Ini adalah pertanyaan yang bagus dan berguna
Hanxue

Jawaban:

392

Anda dapat menentukan formatter dan menggunakan lstart, seperti perintah ini:

ps -eo pid,lstart,cmd

Perintah di atas akan menampilkan semua proses, dengan format untuk mendapatkan PID, perintah dijalankan, dan tanggal + waktu dimulai.

Contoh (dari baris perintah Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Anda dapat membaca pshalaman manual atau memeriksa halaman Opengroup untuk pemformat lain.

wkl
sumber
3
@ bobbyrne01: ubah urutannya, mis. pid, etime, cmd bekerja untuk saya di Debian Wheezy.
exic
1
@ Gobliins - etimeadalah waktu yang berlalu sejak proses dimulai.
wkl
4
untuk kelengkapan, bagi mereka yang terbiasa dengan sintaks BSD: ps axo pid,cmd,lstartjuga berfungsi
Graeme Moss
2
@ bobbyme01: gunakan opsi -ww
Ed Randall
1
Ketahuilah bahwa lstartwaktu dapat berubah, statmetode di bawah ini lebih aman - unix.stackexchange.com/questions/274610/… .
slm
43

Perintah ps (setidaknya versi procps yang digunakan oleh banyak distribusi Linux) memiliki sejumlah bidang format yang berhubungan dengan waktu mulai proses, termasuk lstartyang selalu memberikan tanggal dan waktu lengkap proses dimulai:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Untuk diskusi tentang bagaimana informasi tersebut dipublikasikan di sistem file / proc, lihat /unix/7870/how-to-check-how-long-a-process-has-been-running

(Dalam pengalaman saya di Linux, cap waktu pada direktori / proc / tampaknya terkait dengan saat ketika direktori virtual baru-baru ini diakses daripada waktu mulai proses:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Perhatikan bahwa dalam hal ini saya menjalankan perintah "ps -p 1" pada sekitar 16:50, kemudian menghasilkan bash shell baru, kemudian menjalankan perintah "ps -p 1 -p $$" di dalam shell itu tidak lama kemudian ... .)

Nathan
sumber
Untuk melihat setiap proses (bukan hanya milik Anda) tambahkan argumen e( pssintaks standar ) atau ax(sintaks BSD) ke perintah ps: ie ps -ewo pid,lstart,cmdataups -axwo pid,lstart,cmd
Ryan Griffith
15

Sebagai tindak lanjut dari jawaban Adam Matan , /proc/<pid>cap waktu direktori seperti itu tidak selalu berguna secara langsung, tetapi Anda dapat menggunakan

awk -v RS=')' 'END{print $20}' /proc/12345/stat

untuk mendapatkan waktu mulai dalam tick sejak sistem boot. 1

Ini adalah unit yang agak rumit untuk digunakan; lihat juga mengonversi jiffies ke detik untuk detailnya.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

Ini akan memberi Anda waktu beberapa detik, yang bisa Anda lewati strftime()untuk mendapatkan cap waktu (yang bisa dibaca manusia).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Diperbarui dengan beberapa perbaikan dari Stephane Chazelas di komentar; terima kasih seperti biasa!

Jika Anda hanya memiliki Mawk, mungkin mencoba

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 orang proc ; mencari starttime .

tripleee
sumber
Sedikit refactored untuk penggunaan produksi: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee
1
Ingatlah bahwa itu strftime()dan systime()tidak ada di mawkdalamnya, yang merupakan default awkpada gambar VPS Debian 8 saya, jadi saya hanya dapat berasumsi bahwa itu adalah khusus untuk gawkdialek.
ssokolow
13
ls -ltrh /proc | grep YOUR-PID-HERE

Misalnya, PID Google Chrome saya adalah 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583
Adam Matan
sumber
6
Ini tidak berfungsi untuk saya - ini mencetak waktu modifikasi (sering berubah) Mungkin karena ini: unix.stackexchange.com/questions/20460/…
user920391
Stempel waktu dari / proc / <pid> tidak dapat diandalkan.
Henning
1
Ini mengembalikan waktu 9 menit lebih lambat daripada ketika proses saya memiliki informasi tentang sebenarnya dimulai.
Dan Dascalescu
1
Ini sepertinya satu-satunya pilihan saya yang berfungsi, meskipun mungkin tidak dapat diandalkan. Saya menggunakan sistem tertanam yang hanya memiliki busybox psyang menyatakan invalid optionsemua opsi yang disebutkan oleh jawaban lain.
Qi Fan
7
Mengapa grep? Mengapa tidak ls -ldh /proc/$pid? Atau lebih baik lagi , date -r /proc/$pid?
Caesar
6
 ps -eo pid,etime,cmd|sort -n -k2
bash-o-logist
sumber
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Stackoverflow
sumber
1
Ini akan mencakup prosesnya sendiri juga
Paul Verschoor