获取长时间运行的 Linux 进程的启动时间信息
1. 简介
有时了解流程何时开始可能会很棘手,尤其是当流程是旧流程时。
在本教程中,我们将研究从流程中提取此信息的方法。让我们开始吧。
2. 检查 /proc
要查找与进程相关的任何信息,最著名的地方是proc 文件系统。 proc是一个伪文件系统,它为我们提供了一个访问内核级进程数据的接口。
因此,我们可能期望我们至少可以获得某种形式的数据,这些数据可以让我们深入了解特定进程何时开始运行。实际上,我们可以使用ls -ld来获取有关特定进程的所需信息。让我们运行命令看看输出数据的形式:
$ ls -ld /proc/1
dr-xr-xr-x 9 root root 0 Apr 20 12:27 /proc/1
我们得到了如上所示的日期信息。现在我们可以获取特定进程的日期信息,让我们看看可以更清楚地提供此类详细信息的工具。
3. 使用 ps
ps 是显示有关活动进程的几条信息的主要工具。**ps通过读取 Linux 上 /proc 伪文件系统中的虚拟文件来工作。**事实上,在 /proc/[ pid]/stat 字段下,需要的时间信息是以jiffies 为单位的,jiffies 是Linux 内核中使用的一种时间计数器。
幸运的是, ps负责将 jiffies 转换为人类可读的日期和时间,以便我们可以从数据中获得有用的见解。
3.1. 获取一般信息
使用 ps获取有关进程的信息的最常用方法是使用选项 -ef。基本上,我们可以获得启动时间数据以及其他有用的信息,如 PID 和命令。让我们执行命令以查看输出:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:27 ? 00:00:08 /sbin/init splash
root 2 0 0 12:27 ? 00:00:00 [kthreadd]
root 3 2 0 12:27 ? 00:00:00 [rcu_gp]
root 4 2 0 12:27 ? 00:00:00 [rcu_par_gp]
root 6 2 0 12:27 ? 00:00:00 [kworker/0:0H-events_highpri
...
root 4450 2 0 16:42 ? 00:00:00 [kworker/1:1-events]
root 4466 2 0 16:59 ? 00:00:00 [kworker/u4:0-events_unbound
root 4470 1 0 17:02 ? 00:00:00 /usr/libexec/fprintd
blogdemo 4488 3580 9 17:03 ? 00:00:00 /usr/bin/nautilus --gapplica
blogdemo 4513 4191 0 17:03 pts/0 00:00:00 ps -ef
正如我们所说,我们可以在 s**时间列下看到开始时间信息。但是,时间信息并不准确,仅以“HH:MM” 格式显示。在这种情况下,我们无法访问长时间运行的进程。这仅显示在执行命令的当天启动的进程。
3.2. 适当显示开始时间
与前一种情况不同,我们想要操纵ps以达到更理想的输出。幸运的是, ps还有一个名为 lstart的数据列,供我们获取格式化信息,其中还包括较早的长时间运行的进程:
$ ps -eo user,pid,lstart,cmd
USER PID STARTED CMD
root 1 Wed Apr 20 12:27:33 2022 /sbin/init splash
root 2 Wed Apr 20 12:27:33 2022 [kthreadd]
root 3 Wed Apr 20 12:27:33 2022 [rcu_gp]
root 4 Wed Apr 20 12:27:33 2022 [rcu_par_gp]
root 6 Wed Apr 20 12:27:33 2022 [kworker/0:0H-events_highpri]
...
root 4547 Wed Apr 20 17:28:23 2022 [kworker/1:1-cgroup_destroy]
root 4551 Wed Apr 20 17:30:43 2022 [kworker/0:0-cgroup_destroy]
root 4599 Wed Apr 20 17:33:44 2022 [kworker/u4:2-events_power_efficient]
root 4604 Wed Apr 20 17:33:56 2022 [kworker/1:2-events]
blogdemo 4613 Wed Apr 20 17:40:33 2022 ps -eo user,pid,lstart,cmd
正如我们在上面看到的那样,我们可以通过使用选项 -o选择要显示的列来获得全面的开始时间信息。 此外,我们可以使用此技术通过选项*-p*获取有关特定进程的信息:
$ ps -p 1 -o cmd=,lstart=
/sbin/init splash Wed Apr 20 12:27:33 2022
此外,请注意我们放置符号“ =”只是为了隐藏不必要的标题行。
3.3. start、stime和lstart之间的区别
到目前为止,我们看到了像stime这样的数据列,而没有仔细研究它们的实际含义。为了弄清楚事情,我们需要指出这些信息集之间的差异。
**如果进程创建时间少于 24 小时,start 将开始时间数据格式化为“HH:MM:SS” **。如果进程较旧,则格式变为“Mmm dd”。
**另一方面,如果进程使用时间少于一天,则stime 的格式为“HH:MM”。 **如果过程不是在同一天而是在同一年:“MmmDD”。如果进程超过一年,则stime仅显示年份。
**最后, lstart以“Ddd Mmm dd HH:MM:SS YYYY”格式显示开始时间数据和每个细节。**让我们在一个例子中看一下所有这些:
$ ps -eo pid,start,stime,lstart
PID STARTED STIME STARTED
1 12:27:33 12:27 Wed Apr 20 12:27:33 2022
2 12:27:33 12:27 Wed Apr 20 12:27:33 2022
3 12:27:33 12:27 Wed Apr 20 12:27:33 2022
4 12:27:33 12:27 Wed Apr 20 12:27:33 2022
6 12:27:33 12:27 Wed Apr 20 12:27:33 2022
...