Linux プロセスの稼働時間を調べる方法

Linux プロセスの稼働時間を調べる方法

特定の Linux プロセスの稼働時間を調べるにはどうすればよいですか。

ps aux | grep gedit | grep -v grep

プロセスが開始された時間を含む、大量の情報が得られます。特に、プロセスの稼働時間をミリ秒単位で返すスイッチを探しています。

ありがとう

答え1

「uptime」にはいくつかの意味があるので、ここでは便利なコマンドを紹介します。

ps -eo pid,comm,lstart,etime,time,args

このコマンドは、いくつかの異なる時間関連の列を持つすべてのプロセスを一覧表示します。次の列があります。

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= プロセスIDが
先頭COMMAND= オプションや引数なしのコマンド名のみ
STARTED= プロセスが開始された絶対時間
ELAPSED= プロセスが開始されてからの経過時間(壁時計の時間)、形式 [[dd-]hh:]mm:ss TIME= 累積 CPU 時間、"[dd-]hh:mm:ss" 形式
2 番目COMMAND= 再びコマンド、今回はすべてのオプションと引数を含む

答え2

psにあるようなの制限付きバージョンがある場合はbusybox、 のタイムスタンプを調べることでプロセスの開始時刻を取得できます/proc/<PID>。たとえば、調べたい pid が 55 の場合...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

...そしてそれを現在の日付と比較します...

# date
Thu May 22 03:00:47 EDT 2014

答え3

次のように実行するだけでよいと思います:

$ stat /proc/1234

1234 はプロセス ID です。

2 つのプロセスが同じ時間、分、秒に開始されるが同じミリ秒ではない例:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

答え4

こんな簡単なことが5年経ってもちゃんと答えられないのか?

ミリ秒を正確に取得できるとは思いません。たとえば、フィールド 22 が「クロック ティック」のスタータイムであるものを見るとman procfs/proc/$$/statより正確な値が得られますが、クロック ティックは (「ウォール クロック時間」に対して) 完全に一定の速度で進むわけではなく、ずれたり、スリープ状態になったり、特定のもの (おそらく ntpd) によってオフセットされたりします。たとえば、ntpd を実行しているマシンで、8 日間稼働していてスリープ状態になっていない場合、dmesg -T同じ問題が発生します (おそらく...)。ここで確認できます。

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

秒数は次のとおりです:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

関連情報