特定のLinuxプロセスの稼働時間を確認するにはどうすればよいですか。
ps aux | grep gedit | grep -v grep
プロセスが開始された時間を含む多くの情報を提供します。プロセスの稼働時間をミリ秒単位で返すスイッチを特に探しています。
ありがとう
特定のLinuxプロセスの稼働時間を確認するにはどうすればよいですか。
ps aux | grep gedit | grep -v grep
プロセスが開始された時間を含む多くの情報を提供します。プロセスの稼働時間をミリ秒単位で返すスイッチを特に探しています。
ありがとう
回答:
「稼働時間」にはいくつかの意味があるため、便利なコマンドを次に示します。
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
=再びコマンド、今回は提供されたすべてのオプションと引数
にある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
私はあなたがちょうど実行できると思う:
$ 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
このような単純なことは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"
はい、古すぎますが、非常に難しいものです。上記の「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
etimes
秒単位の時間を経過- -自分自身をので、機械可読だ