我有一个.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。
这里有一些选项:
/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