Bir süreç ne zaman başladı


31

Bir sürecin ne zaman başladığını bilmek benim ilk tahminim, /proc/<pid>/cmdlineen son ne zaman yazıldığını / değiştirildiğini kontrol etmekti.

psayrıca bir STARTalan gösterir . Bu iki kaynağın da aynı olacağını düşündüm. Bazen onlar aynı değildir. Bu nasıl olabildi?


Yanıtlar:


44

En azından Linux'ta şunları da yapabilirsiniz:

ps -o lstart= -p the-pid

Daha kullanışlı bir başlangıç ​​zamanına sahip olmak.

Bununla birlikte, işlemin başlatılma zamanı geldiğine dikkat edin, mutlaka yürütmekte olduğu komutun başlatıldığı saat değil . İşlemler, yaşamları boyunca birden fazla komutu çalıştırabilir (ve genellikle yapar). Ve komutlar bazen başka süreçleri de doğurur.

/procLinux'taki dosyaların taklitleri (en azından) genellikle bu dosyaların başlatıldığı tarihlerdir; bu, bir şey dosyalara ilk kez erişmeye veya dizin içeriğini listelemeye çalışır.

Örneğin:

$ 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

Genişletmek /proc/$$/xx*, kabuğun dosyanın başlatılmasına /proc/$$neden olan içeriği okumasına neden oldu cmdline.

Ayrıca bakınız: / proc // fd içindeki soketin zaman damgası


11

proc sanal bir dosya sistemidir, bu yüzden herhangi bir dosya durumu bilgisine güvenmem.

İşlemin başlangıç ​​zamanı / proc / PID / stat sütununda 22 bulunur . Sistem önyüklemesinden sonra anında verilir. Saniyeye dönüştürmek sysconf(_SC_CLK_TCK)için, çoğu sistem için 100'dür (ama hepsi değil!).

Sistem önyükleme zamanını almak için geçerli çalışma zamanını / proc / uptime'ın ilk değeri olan saniye cinsinden belirlersiniz .

Bu iki sayıya sahip olduğunuzda, birinciyi ikinciden çıkarırsınız ve programın başlamasından bu yana geçen saniye sayısını alırsınız.

Örnek ( pidgin için ):

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

Not: Bu basit örnek, çoklu pidofPID'leri döndürürse işe yaramaz .


Proc / <pid> / cmdline'ın ne zaman yazılacağı hakkında bir fikrin var mı? iyi bu konuda herhangi bir proc / <pid> girişleri.
Swir,

2
Genellikle bu dosyalar çekirdek tarafından, ne zaman okumaya çalıştığınıza dinamik olarak oluşturulur ve çoğu da dinamik bir içeriğe sahiptir. cmdline gelmiyor ama süreç başladığında bir kez yaratılması ve bir daha asla dokunulmaması gerektiğini belirten resmi bir politika olduğunu hayal edemiyorum.
scai

"Getconf CLK_TCK"
oᴉɹǝɥɔ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.