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

grep linux process uptime

指定されたlinuxプロセスのアップタイムを見つけるにはどうすればいいですか?

ps aux | grep gedit | grep -v grep

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

Thanks

  76  Mahadevan Sreenivasan  2012-01-20


ベストアンサー

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

126  Abdull  2012-08-21


busyboxのようにpsのバージョンが限定されている場合、/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

12  goertzenator  2015-07-14


走ればいいんじゃない?

$ 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

8  yohann.martineau  2017-11-15


はい、あまりにも古くて、まだあまりにも難しいものです。私は上記の提案された “stat” メソッドで試してみましたが、もし私が昨日 PID proc dir を “touch” したとしたらどうでしょうか?これは、私の一年前のプロセスが昨日のタイムスタンプで表示されることを意味します。いや、私が必要としているものではありません

新しいものではシンプルに

ps -o etimes -p <PID>
ELAPSED
339521

それほど簡単なことではありません。時間は秒単位で存在する。あなたがそれを必要とするものは何でもします。いくつかの古いボックスでは、状況は難しいです。1つは頼りになります

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

5  George Ivanov  2018-08-27


そんな簡単なことが、5年後にはきちんと答えられていないのでしょうか

ミリ秒を正確に取得することはできないと思います。例えば、man procfsを見て、フィールド22がスタートタイムである/proc/$$/statを見ると、”clock ticks “の中にあるので、より正確な情報が得られると思いますが、clock ticksは完全に一定の速度で進むわけではなく(「壁時計の時間」との相対的な)、ずれてしまいます…スリープや特定のもの(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

Here’s seconds:

# 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"

5  Peter  2017-03-03


プロセス名で

ps -eo pid,comm,lstart,etime,args | grep MyProcessName | cut -b 1-200

Where:

  • MyProcessNameはプロセス名です
  • psはすべてのプロセスをリストアップしています
  • grepargsMyProcessNameでフィルタリングします
  • cutは、各行の最初の200文字をリストアップします。Javaのコマンドラインはかなり長いことが多いので便利です

このようなものを生成します

 10673 java            Tue Aug 25 12:26:30 2020    19:19:25 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName1
10908 java            Tue Aug 25 12:26:41 2020    19:19:14 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName2
11062 java            Tue Aug 25 12:26:52 2020    19:19:03 /opt/apps/java_home/bin/java -Dservice.name=MyProcessName3

8月26日の12時26分に全てのサービスが開始され、いずれも何らかの理由で再起動していないことがわかります

0  Contango  2020-08-26


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

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

etimes= => 時間は秒単位で、’=’はヘッダを削除するためのものです

-1  Rohit  2019-01-07


タイトルとURLをコピーしました