Linuxプロセスの稼働時間を見つける方法


69

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

ps aux | grep gedit | grep -v grep

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

ありがとう

回答:


113

「稼働時間」にはいくつかの意味があるため、便利なコマンドを次に示します。

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」形式
second COMMAND=再びコマンド、今回は提供されたすべてのオプションと引数


1
いいね 私が好むetimes秒単位の時間を経過- -自分自身をので、機械可読だ
Asfand Qazi

1
質問はミリ秒単位の
-yohann.martineau

残念ながら、busybox 1.29.3はetimeのフォーマットを破ったので、構文解析に依存しないでください。
ダニーデュライ

10

にある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

これは現在のカーネルでは動作しないようです。
goertzenator

7

私はあなたがちょうど実行できると思う:

$ 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年後に適切に答えられないのですか?

ミリ秒を正確に取得できるとは思わない。例えば。あなたが見る場合man procfsと見/proc/$$/stat、「クロック・チック」であるSTARTIME、としてフィールド22を有している、あなたは、より正確な何かを持っているだろうが、クロックティックは(「壁時計の時間」と比較して)完全に一定の割合で行くとしませんされていますオフに...睡眠と特定のもの(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"

3

はい、古すぎますが、非常に難しいものです。上記の「stat」メソッドを試してみましたが、昨日PID proc dirを「タッチ」した場合はどうなりますか?これは、私の1年前のプロセスが昨日のタイムスタンプで表示されることを意味します。いや、私が必要なものではない:(

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

ps -o etimes -p <PID>
ELAPSED
339521

それと同じくらい簡単です。時間は秒単位で存在します。必要なことは何でもしてください。いくつかの古いボックスでは、時間が無いので状況はより困難です。頼ることができます:

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

これは古いシステムでそれを行うのに本当に良い方法です、ありがとう:)
RobotJohnny

busybox 1.29.3がフォーマットを変更したため、etimeの出力を解析しないでください。代わりにstat + / procメソッドを使用してください
ダニーデュライ

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => JavaプロセスのプロセスID

etimes= =>秒単位の時間で、「=」はヘッダーを削除します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.