2014-01-30 21 views
1

我使用php进程在后台发送电子邮件,我试图找到一种方法来自动恢复万一服务器发生故障或脚本发生了什么事情使其停止。PHP:我如何唯一标识Linux上的进程?

我的逻辑是:如果发送会话仍在运行但在X时间内没有发送新邮件,请杀死进程(如果已经运行并启动新进程)。

现在,我的问题在于“杀死进程如果已经运行”部分。我如何确定使用此PID的这个过程与我为发送会话启动的过程相同?我无法检查名称,因为我将要同时运行其中的几个。我不想杀死一个随机进程或另一个发送进程。

所以问题是:我怎样才能唯一识别在Linux上运行的进程?或者,我怎样才能以某种方式标记它,使其具有独特性?有没有办法从外面检查它的参数?

+0

您可以创建像大多数其他软件PID文件不和雏鸡此文件。一个db存储值也可用。如果它是一个控制台运行PHP脚本,则可以使用getmypid()存储您的PID,并在必要时使用此PID来终止。 – ToBe

+0

我已经有存储在数据库中的进程的PID。我需要一些方法来确保这无疑是发送会话的正确过程。 – Bogdan

+0

如果您的脚本是作为控制台PHP脚本运行的,则可以确定。 – ToBe

回答

0

与评论中建议的不同,PID是不是由于PID重用(由于有限数量的唯一PID,通常为32768)而足以唯一地标识进程。但是,如果将pid与流程的开始时间结合起来,则在实践中应该足够独特。和开始时间内核滴答被记录在/ proc/$ PID/STAT,考虑到这一点,你可以做这样一个独特的上下的哈希:

function unique_hash_pid(int $pid): string { 
    return $pid . ':' . (explode (' ', file_get_contents ('/proc/' . $pid . '/stat')) [21]); 
} 

(我想象加工开始的机会,然后通过PHP进行唯一标识,然后退出,然后再开始另一个进程,并将其重新分配给完全相同的pid,所有内容都在单个内核标记中,实际上为零,因此这个散列应该是唯一的。但请知道!)

但是,知道这个函数不考虑重启,并且可能会产生相同的散列值,用于重启之间的2个完全不同的进程(如果相同的pid开始于精确的相同的内核刻度下注ween 2重新启动。我想这是相当常见的启动脚本)