Contents

获取长时间运行的 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. startstimelstart之间的区别

到目前为止,我们看到了像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
    ...