从命令行获取进程年龄

Mat*_*nco 6 linux shell-script process-management

在 linux 中,从/proc/PID/stat,我可以获得start_time(22:nd) 字段,该字段表示内核启动后进程启动的时间。

将其转换为自纪元以来的秒数格式的好方法是什么?它添加到btime/proc/stat

基本上,我正在寻找过程的年龄,而不是它开始的确切时间。我的第一种方法是将start_time正在调查的进程start_time的 与当前进程的 进行比较(假设它没有运行很长时间)。

当然必须有更好的方法。

在查看https://www.kernel.org/doc/Documentation/filesystems/proc.txt时,我没有发现任何明显的与年龄相关的参数

所以,我目前拥有的是:

process age = (current_utime - ([kernel]btime + [process]start_time))
Run Code Online (Sandbox Code Playgroud)

任何在 shell 脚本中更有效的替代方法?(理想情况下跨 DST 更改是正确的)

Sté*_*las 11

从 3.3.0 版开始,Linux 上的psofprocps-ng有一个etimes输出字段,它为您提供自进程启动以来经过的时间(以秒为单位)(顺便说一句,这不一定与自该进程上次执行以来经过的时间相同命令(如果有的话!)(该进程在进程名称中运行命令的时间),所以可能没有你想象的那么有用)。

所以你可以这样做:

ps -o etimes= -p "$pid"
Run Code Online (Sandbox Code Playgroud)

对于作为 Unix 纪元时间的开始时间(使用 GNU date):

(export TZ=UTC0 LC_ALL=C; date -d "$(ps -o lstart= -p "$pid")" +%s)
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用 的修改时间/proc/$pid那只是这些文件被实例化的时间,与进程的开始时间无关。


Arc*_*mar 8

进程的年龄:人类可读的形式

ps -p 1234 -o etime -h
        1-02:03:04
Run Code Online (Sandbox Code Playgroud)

自 epoch 以来的第二个进程

stat --format=%Y /proc/1234
Run Code Online (Sandbox Code Playgroud)

秒龄

expr $(date +%s) - $(stat --format=%Y /proc/1234)
Run Code Online (Sandbox Code Playgroud)

额外的资源ps(1)stat(1)