要知道进程何时启动,我的第一个猜测是检查/proc/<pid>/cmdline
上次写入/修改的时间。
ps
还显示一个START
字段。我认为这两个来源是相同的。有时它们并不相同。怎么可能呢?
答案1
至少在 Linux 上,你还可以这样做:
ps -o lstart= -p the-pid
以获得更有用的开始时间。
但请注意,现在是过程开始的时间,不一定是时间命令它当前正在执行被调用。进程可以(并且通常)在其生命周期中运行多个命令。命令有时会产生其他进程。
Linux上文件的修改时间/proc
(至少)通常是这些文件被实例化的日期,这将是第一次尝试访问它们或列出目录内容的日期。
例如:
$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000
扩展/proc/$$/xx*
导致 shell 读取/proc/$$
其中的内容,从而导致cmdline
文件被实例化。
也可以看看:/proc//fd 中套接字的时间戳
答案2
过程是一个虚拟文件系统,所以我不会依赖任何文件状态信息。
该进程的开始时间位于/proc/PID/统计柱子22。它在系统启动后立即给出。要将其转换为秒,您必须将其除以sysconf(_SC_CLK_TCK)
100最多系统(但不是全部!)。
要获取系统启动时间,您可以确定当前的正常运行时间(以秒为单位),这是第一个值/proc/正常运行时间。
有了这两个数字,你用第二个数字减去第一个数字,你就得到了自启动程序以来经过的秒数。
示例(对于洋泾浜语):
PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF
pidof
注意:如果返回多个 PID,这个简单的示例将不起作用。