web-dev-qa-db-ja.com

Linuxプロセスのアップデートタイムを見つける方法

どのように私は与えられたLinuxプロセスの稼働時間を見つけるのですか。

ps aux | grep gedit | grep -v grep

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

ありがとう

66

「稼働時間」にはいくつかの意味があるので、これは便利なコマンドです。

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 =ここでもコマンドです。今回はすべてのオプションと引数が含まれています

111
Abdull

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
9
goertzenator

私はあなたが走ることができると思います:

$ 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
6

そのような単純なことは5年後に正しく答えられないのですか?

私はあなたが正確にミリ秒を得ることができるとは思わない。例えば。 man procfsを見て、フィールド22をstartimeとして持っている/proc/$$/statを見れば、それはもっと正確なものになるでしょう、しかし、時計の刻みは完全に一定のレートではありません( 'wall clock time'に対して)。そして眠っていて、特定のもの(ntpd)がそれを相殺します。たとえば、8日間の稼働時間があり、一度も寝たことがないntpdを実行しているマシンでは、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"
4
Peter

はい、古すぎるしまだ硬すぎるもの。上記で提案した "stat"メソッドを試しましたが、昨日PID procディレクトリを "touch"した場合はどうなりますか?これは私の1年前のプロセスが昨日のタイムスタンプで示されていることを意味します。いや、私が必要なものではない:(

新しいものでは、それは簡単です:

ps -o etimes -p <PID>
ELAPSED
339521

それと同じくらい簡単です。時間は秒単位で表示されます。必要なことは何でもしてください。いくつかの古い箱では、etimesがないので状況はより困難です。に頼ることができる:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

これはdd-hh:mm:ss形式なので、「ちょっと変な」ように見えます。それ以上の計算には適していません。私は数秒でそれを好むと思いますので、私はこれを使用しました:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544
3
George Ivanov