我如何确保正在运行的进程正在运行?

背景

我有一个linux [1]系统pipe理一系列第三方守护进程,它们的交互仅限于shell [2] init脚本,即只有{start | restart | stop | status}可用。

问题

进程可以假设以前运行的进程的PID,通过检查正在运行的进程是否存在进程,检查进程的状态。

例如

过程一个PID 123的运行,随后死亡,进程B用PID 123初始化,状态命令用一个不正确的(错误的)“OK”响应。 换句话说,我们只检查是否存在一个PID过程来validation过程是否正在运行,我们假设如果存在一个具有这个PID的过程,那么这个过程是有问题的。

build议的解决scheme

  1. 使用PID询问进程,确保命令/守护进程按照预期的那样运行。 这个解决scheme的问题是,命令和PID都需要匹配; 因此需要保持多位信息并保持同步,并且增加了错误/边缘条件的复杂性。
  2. 将PID文件的创build时间与进程的开始时间相关联,如果进程在PID文件创build时间的某个增量范围内,我们可以确定命令/守护进程运行如期。

除了使用该PID运行的进程以外,是否有标准方法来批准进程/ PID文件的真实性? 即我(作为系统)想知道你(stream程)是否正在运行,如果你是我认为你是谁(A而不是B)。

假设我们已经select实施上面提出的第二种解决scheme,PID创build时间和过程开始时间之间的置信区间/增量是合理的吗? 在这里,合理的手段可以接受types1 /types2错误之间的妥协。

[1] CentOS / RHEL [2] Bash

该文件的内容:

的/ proc / {PID} / CMDLINE

是用来启动进程的命令行。 那是你需要的吗?

我的解决方案是捕获命令(通过/proc/PID/cmdline )以及相对的开始时间。 使用绝对开始时间 (通过ps -p PID -o lstart= )似乎可以正常工作,但是如果系统时钟发生变化 (例如,来自NTP更新或夏令时),则会产生令人困惑的结果 。

这是我的实现:

 # Prints enough detail to confirm a PID still refers to the same process. # In other words, even if a PID is recycled by a call to the same process the # output of this command should still be different. This is not guaranteed # across reboots. proc_detail() { local pid=${1:?Must specify PID} # the process' commandline, if it's running # ensures a non-existant PID will never have the same output as a running # process, and helps debugging cat "/proc/$pid/cmdline" 2> /dev/null && echo # this is the number of seconds after boot that the process started # https://unix.stackexchange.com/a/274722/19157 # in theory this could collide if the same process were restarted in the same # second and assigned the same PID, but PIDs are assigned in order so this # seems acceptably unlikely for now. echo "$(($(cut -d. -f1 < /proc/uptime) - \ $(ps -p "$pid" -o etimes= 2> /dev/null || echo "0")))" } 

我也决定将这个输出保存在/dev/shm以便在关机时自动清除。 还有其他可行的选项(比如@reboot cronjob),但是对于我的用例来说,写入tmpfs很简单,干净。