我正在编写一个Perl脚本,该脚本分析日志文件以收集PID,然后检查该PID是否正在运行。我正在尝试最好的检查方法。显然,我可以这样做:
system("ps $pid > /dev/null") && print "Not running\n";
但是,如果可能的话,我宁愿避免系统调用。因此,我认为我可以使用/proc
文件系统(可移植性不是问题,它将始终在Linux系统上运行)。例如:
if(! -d "/proc/$pid"){
print "Not running\n";
}
这样安全吗?我是否可以总是假设如果没有/proc/$pid/
目录,则关联的PID未运行?我希望如此,因为AFAIK ps
本身/proc
还是从信息中获取信息,但是由于这是针对生产代码的,因此我想确定一下。
因此,是否可能存在正在运行的进程没有/proc/PID
目录或/proc/PID
存在目录且进程未运行的情况?有没有理由更喜欢解析而ps
不是检查目录是否存在?
kill -0
最好的方法),这只会告诉您是否存在具有给定PID的正在运行的进程。它不会告诉您该进程是否在一毫秒后仍将继续运行,也不会告诉您该进程是您感兴趣的进程还是在有趣的进程死亡后分配了相同PID的不相关进程。测试给定的PID是否正在运行几乎总是一个错误:在极少数情况下,这不容易出现竞争状况。
kill
使用信号0 的perl 函数,该信号不会杀死,但会说是否可以这样做(即您需要允许该过程发出信号)。