Kapan suatu proses dimulai

31

Untuk mengetahui kapan suatu proses dimulai, tebakan pertama saya adalah memeriksa waktu kapan /proc/<pid>/cmdlineditulis / dimodifikasi terakhir kali.

psjuga menunjukkan STARTbidang. Saya pikir kedua sumber ini akan sama. Terkadang mereka tidak sama. Bagaimana bisa?

Swair
sumber

Jawaban:

44

Setidaknya di Linux, Anda juga dapat melakukan:

ps -o lstart= -p the-pid

untuk memiliki waktu mulai yang lebih berguna.

Namun perlu dicatat bahwa inilah saat proses dimulai, belum tentu saat perintah yang sedang dijalankan dijalankan. Proses dapat (dan umumnya dilakukan) menjalankan lebih dari satu perintah dalam masa hidupnya. Dan kadang-kadang perintah menelurkan proses lainnya.

Mtimes dari file-file di /procLinux (setidaknya) umumnya tanggal ketika file-file tersebut dipakai, yang akan menjadi pertama kalinya sesuatu mencoba mengaksesnya atau daftar konten direktori.

Contohnya:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

Mengembang /proc/$$/xx*menyebabkan shell membaca konten /proc/$$yang menyebabkan cmdlinefile tersebut dipakai.

Lihat juga: Stempel waktu soket di / proc // fd

Stéphane Chazelas
sumber
11

proc adalah sistem file virtual jadi saya tidak akan bergantung pada informasi status file apa pun.

Waktu mulai dari proses ini terletak di / proc / PID / stat kolom 22 . Ini diberikan dalam sekejap setelah boot sistem. Untuk mengonversinya menjadi detik, Anda harus membaginya dengan sysconf(_SC_CLK_TCK)100 untuk sebagian besar sistem (tetapi tidak semua!).

Untuk mendapatkan waktu boot sistem Anda menentukan uptime saat ini dalam hitungan detik yang merupakan nilai pertama dari / proc / uptime .

Memiliki dua angka yang Anda kurangi yang pertama dari yang kedua dan Anda mendapatkan jumlah detik berlalu sejak memulai program.

Contoh (untuk pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Catatan: contoh sederhana ini tidak berfungsi jika pidofmengembalikan PID multipe.

scai
sumber
Tahu kapan proc / <pid> / cmdline ditulis? baik entri proc / <pid> dalam hal ini.
Swair
2
Biasanya file-file tersebut dihasilkan oleh kernel secara dinamis setiap kali Anda mencoba untuk membacanya dan sebagian besar dari mereka juga memiliki konten yang dinamis. cmdline tidak tetapi saya tidak dapat membayangkan bahwa ada kebijakan resmi yang menyatakan harus dibuat sekali pada proses startup dan tidak pernah disentuh lagi.
scai
Anda bisa mendapatkan nilai _SC_CLK_TCK dari baris perintah dengan mengeksekusi "getconf CLK_TCK"
oᴉɹǝɥɔ