什么是检查PID是否正在运行的正确方法?

我有一个.pid文件,我需要检查进程是否正在运行。 到目前为止我find了两个select

 kill -0 `cat something.pid` 

如果pid没有运行,它会打印出一个错误。 我知道这可以redirect到/dev/null ,但是这让我觉得这不是最好的解决scheme。

第二个解决scheme是使用ps ,但是也可以在STDOUT上打印

 ps -ef `cat something.pid` 

将输出redirect到/dev/null并正确使用返回的状态代码是正常的,还是表明我做错了什么,我需要一个不同的命令?

对于大多数Linux发行版来说,枚举/ proc / {pid}是获取有关正在运行的进程的信息的好方法,通常像“ps”这样的用户空间命令是如何与内核进行通信的。 比如你可以做;

 [ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists" 

编辑:你应该检查,设置kpid,但这是更有用,因为它会返回“不存在”未设置$ {kpid}

 [ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists" 

正如Anders指出的那样,您应该使用kill -0来符合POSIX标准。

在Linux系统上,您还可以检查/ proc文件系统中是否存在文件,例如,

 -f /proc/$(cat something.pid)/status 

如果这是一个脚本(我认为是这种情况,因为你担心打印到标准输出),那么下面是你如何做到这一点:

 if ps -p $(cat something.pid) > /dev/null 2>&1 then kill $(cat something.pid) else # Deal with the fact that the process isn't running # ie clear up the pid file fi 

ps -p用something.pid中指定的pid来查找一个进程( $()语法是一个稍微更新的反引用版本,在某些新forms不支持的情况下,反引用需要转义)。 2>&1redirect该命令的stderr。

如果ps -p命令没有find具有该PID的进程,那么退出的错误> 0,所以else被执行。 否则, kill语句。 如果你想通过做,你可以否定上述:

 if ! ps -p ... 

希望能回答你的问题。 显然,在使用诸如kill危险命令时要小心并进行大量的testing。

这里有一些选项:

  • 如果你正在编写init脚本(例如放在/etc/init.d/的脚本),并且你使用的是基于Debian的发行版,那么最好使用start-stop-daemon
     # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME 

    如果它正在运行,你应该得到退出代码0。

  • 您可以使用procps包中的pgrep和pkill:
     pgrep --pidfile $PIDFILE