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


12

我有一个.pid文件,我需要检查该进程是否正在运行。到目前为止,我发现了两种选择

kill -0 `cat something.pid`

如果pid没有运行,则会打印出错误。我知道可以将其重定向到/dev/null,但这使我认为这不是最佳解决方案。

第二种解决方案是使用ps,但是它也会在STDOUT上打印

ps -ef `cat something.pid`

将输出重定向到/dev/null并仅使用返回的状态码是正常的吗?或者这是我做错了事情并且需要其他命令的信号吗?


5
kill -0符合标准(POSIX),因此可以使用。
Anders

Answers:


10

对于大多数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"

@SteveMuster这将回答特定于Linux的问题。在OSX上没有/ proc。而且我认为BSD上没有/ proc。

请注意,您需要确保${kpid}存在
Wilf

@Wilf我对其进行了编辑,因此对于未设置的$ {kpid},它返回“进程不存在”
Tom H

谢谢-我正在做一个脚本,使用类似的方法检查PID,直到我发现这是个问题,它才起作用:)
Wilf

6

正如Anders指出的那样,您应该使用kill -0POSIX合规性。

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

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

1

如果这是在脚本中(我认为是这种情况,因为您担心要打印到stdout),则可以使用以下方法:

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
    # i.e. clear up the pid file
fi

ps -p外观与在something.pid指定PID的过程(该$()语法是反引号的小幅更新的版本。BACKTICK需要在新的形式不特定情况下逃脱)。该2>&1重定向标准错误,该命令为好。

如果该ps -p命令没有找到具有该PID的进程,则会退出并显示错误> 0,从而else执行该操作。否则kill声明。您可以通过以下操作取反上述方法:

if ! ps -p ...

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


1

以下是一些选项:

  • 如果您正在编写init-script(例如/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

0

如果您有pid文件,则可以使用pgrep来检查进程是否正在运行:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.