我正在使用php进程在后台发送电子邮件,我正在尝试找到一种方法来自动恢复,以防服务器出现故障或脚本发生故障以使其停止。
我的逻辑是:如果发送会话仍在运行但在X时间内没有发送新电子邮件,则在已经运行的情况下终止该进程并启动新进程。
现在,我的问题在于“杀死进程如果已经运行”部分。如何确定使用此PID的此过程与我为发送会话启动的过程相同?我无法检查名称,因为我将在同一时间运行其中几个。我不想杀死随机进程或其他发送进程。
所以问题是:如何唯一地识别在linux上运行的进程?或者我如何以某种方式标记它以使其独特?有没有办法从外面检查它的参数?
答案 0 :(得分:0)
与注释中建议的不同,由于PID重用(由有限数量的唯一PID(通常为32768)加剧),PID NOT 足以唯一地标识进程。但是,如果你将pid和过程的开始时间结合起来,那么在实践中它应该是足够独特的。并且开始时间内核tick记录在/ proc / $ pid / stat中,考虑到这一点,你可以像这样制作一个unique-ish哈希:
function unique_hash_pid(int $pid): string {
return $pid . ':' . (explode ( ' ', file_get_contents ( '/proc/' . $pid . '/stat' ) ) [21]);
}
(我想象一个进程启动的机会,然后由PHP进行唯一标识,然后退出,然后另一个进程启动,并重新分配到完全相同的pid,所有都在单个内核滴答下,是......实际上因此,这个哈希应该是唯一的。如果有人做了实验室测试,请告诉我!)
然而,知道这个函数不考虑重启,并且可能在重启之间为两个完全不同的进程产生相同的哈希(如果在2次重启之间在完全相同的内核上启动相同的pid。我想这是相当常见的用于启动脚本)
答案 1 :(得分:0)
由于pid的重用,PID不能唯一地标识一个进程。由于同样的原因,元组(pid,command)不能用作标识符。元组(pid,进程启动时间)也不有用,因为进程启动时间似乎很脆弱,并且例如由于NTP时间重置(以及其他原因?)而发生更改,并且更改后的内容不能用作标识符。 / p>
但是,要真正唯一地标识一个过程,我们可以使它们与众不同。例如,在PHP中,函数cli_set_process_title
[1]可用于更改进程标题。如果我们在进程标题前添加一个随机数,并将此随机数与pid一起存储,则我们以后可以区分那些重复使用相同pid但具有不同随机数的进程,以及在标题中具有相同pid和相同随机数的进程
(实际上,随机数现在足以识别进程,而pid并不是必需的,但是存储pid仍然有用,因此我们不必在进程列表中搜索该进程。)
[1] https://www.php.net/manual/en/function.cli-set-process-title.php