是否可以获取旧的运行过程的开始时间?ps
如果今天不是开始日期,似乎将报告日期(而不是时间),如果今年不是开始日期,则仅报告年份。旧工艺会永远失去精度吗?
ps -p <pid> -o lstart=
避免使用其他行(标题)进行打印。
是否可以获取旧的运行过程的开始时间?ps
如果今天不是开始日期,似乎将报告日期(而不是时间),如果今年不是开始日期,则仅报告年份。旧工艺会永远失去精度吗?
ps -p <pid> -o lstart=
避免使用其他行(标题)进行打印。
Answers:
您可以指定格式器并使用lstart
,例如以下命令:
ps -eo pid,lstart,cmd
上面的命令将输出所有进程,并带有格式化程序以获取PID,命令运行以及启动日期和时间。
示例(从Debian / Jessie命令行)
$ ps -eo pid,lstart,cmd
PID CMD STARTED
1 Tue Jun 7 01:29:38 2016 /sbin/init
2 Tue Jun 7 01:29:38 2016 [kthreadd]
3 Tue Jun 7 01:29:38 2016 [ksoftirqd/0]
5 Tue Jun 7 01:29:38 2016 [kworker/0:0H]
7 Tue Jun 7 01:29:38 2016 [rcu_sched]
8 Tue Jun 7 01:29:38 2016 [rcu_bh]
9 Tue Jun 7 01:29:38 2016 [migration/0]
10 Tue Jun 7 01:29:38 2016 [kdevtmpfs]
11 Tue Jun 7 01:29:38 2016 [netns]
277 Tue Jun 7 01:29:38 2016 [writeback]
279 Tue Jun 7 01:29:38 2016 [crypto]
...
您可以阅读ps
的联机帮助页或查看Opengroup的其他格式化程序页面。
etime
是自启动过程以来经过的时间。
ps axo pid,cmd,lstart
也可以使用
ps命令(至少是许多Linux发行版使用的procps版本)具有许多与进程开始时间相关的格式字段,包括lstart
始终提供进程开始的完整日期和时间的格式字段:
# ps -p 1 -wo pid,lstart,cmd
PID STARTED CMD
1 Mon Dec 23 00:31:43 2013 /sbin/init
# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER PID %CPU %MEM VSZ RSS TT STAT STARTED CMD
root 1 0.0 0.1 2800 1152 ? Ss Mon Dec 23 00:31:44 2013 /sbin/init
root 5151 0.3 0.1 4732 1980 pts/2 S Sat Mar 8 16:50:47 2014 bash
有关如何在/ proc文件系统中发布信息的讨论,请参见 /unix/7870/how-to-check-how-long-a-process-has-been-running
(根据我在Linux下的经验,/ proc /目录上的时间戳似乎与最近访问虚拟目录的时刻有关,而不是与进程的开始时间有关:
# date; ls -ld /proc/1 /proc/$$
Sat Mar 8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151
请注意,在这种情况下,我在大约16:50运行了“ ps -p 1”命令,然后生成了一个新的bash shell,然后不久后在该shell中运行了“ ps -p 1 -p $$”命令... )
e
(标准ps
语法)或ax
(BSD语法)参数:ie ps -ewo pid,lstart,cmd
或ps -axwo pid,lstart,cmd
作为Adam Matan回答的后续措施,/proc/<pid>
目录的时间戳本身不一定直接有用,但是您可以使用
awk -v RS=')' 'END{print $20}' /proc/12345/stat
获取自系统启动以来的时钟滴答声的开始时间。1个
这是一个使用起来有点棘手的单元;有关详细信息,另请参见将抖动转换为秒。
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat
这应该给您几秒钟的时间,您可以将其传递给它strftime()
以获取(人类可读或其他方式)的时间戳。
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat
在注释中更新了Stephane Chazelas的一些修复程序;一如既往的感谢!
如果您只有Mawk,也许可以尝试
awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
NR==1 { now=$1; next }
END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}
1 个人过程 ; 搜索开始时间。
strftime()
和systime()
中不存在和mawk
,这是awk
我的Debian 8 VPS图像中的默认设置,因此我只能假定它们特定于gawk
的方言。
ls -ltrh /proc | grep YOUR-PID-HERE
例如,我的Google Chrome浏览器的PID为11583:
ls -l /proc | grep 11583
dr-xr-xr-x 7 adam adam 0 2011-04-20 16:34 11583
ps
其中说出invalid option
了其他答案提到的所有选项。
grep
呢 为什么不ls -ldh /proc/$pid
呢?甚至更好date -r /proc/$pid
?
ps -eo pid,etime,cmd|sort -n -k2
ps -p <pid> -o lstart
吗?似乎可行,但是我不确定为什么在很多时候这个问题似乎不是立即显而易见的答案。