我如何检查文件是否存在,如果不存在则执行一条命令?

41

我使用Python编写了一个守护进程。当它在运行时,位于/tmp/filename.pid的PID文件会存在。如果守护进程没有在运行,则PID文件不存在。

在Linux上,我如何检查以确保PID文件存在?如果不存在,如何执行重启命令?

重启命令为

python daemon.py restart

必须从特定目录执行。


1
你描述中的“必须从特定目录执行”的部分听起来像是麻烦的源头。请注意,如果有可能,请重新考虑。 - Jonathan Leffler
请问如何在Bash中判断文件是否不存在? - user3850
1
将PID文件放在/tmp目录下是不好的,因为某些发行版有更清洁的进程会删除/tmp目录下的文件,而用户也可能会删除那里的文件以释放空间。 - Douglas Leeder
7个回答

86
[ -f /tmp/filename.pid ] || python daemon.py restart

-f检查给定路径是否存在且是常规文件(只有-e检查路径是否存在)

[]执行测试并在成功时返回0,否则返回1

||类似于C语言中的or,如果左侧命令失败,则执行右侧命令。

因此,最终语句的意思是,如果/tmp/filename.pid不存在,则启动守护进程。


“Regular file”是什么意思?还有其他选项吗? - Barakuda
1
@Barakuda - 非常规文件可能是目录、命名管道、网络套接字、字符设备、符号链接... - eduffy
1
必须使用 && 而不是 ||。 - EthraZa
我认为 && 表示如果条件满足,而 || 则是表示如果条件不满足。[ -f my_file ] || echo '不存在' && echo '存在'。 - Jautis

18
test -f filename && daemon.py restart || echo "File doesn't exists"

1
如果只需要检查文件是否存在:test -f 文件名 && echo "存在" || echo "不存在" - lode

11

如果你想了解 bash 脚本编程,以下代码可以实现:

if [ ! -f "$FILENAME" ]; then
   python daemon.py restart
fi
一个更好的选择可能是查看 lockfile

6
其他回答可以检测文件的存在。然而,为了完整解决问题,你可能需要检查pidfile中的PID是否仍在运行,并且它是你的程序。

5
另一种解决问题的方法是编写一个脚本来确保您的守护进程“保持”运行...类似于下面这样的脚本(注意:应添加信号处理以实现正确的启动/关闭):
$PIDFILE = "/path/to/pidfile"

if [ -f "$PIDFILE" ]; then
    echo "Pid file exists!"
    exit 1
fi

while true; do
    # Write it's own pid file
    python your-server.py ;

    # force removal of pid in case of unexpected death.
    rm -f $PIDFILE;

    # sleep for 2 seconds
    sleep 2;

done

以这种方式,即使服务器意外死机,它也会保持活动状态。

如果没有找到"$PIDFILE"文件,应该是if [ -f "$PIDFILE" ]; then,我尝试进行编辑,但更改太小了,无法在stackoverflow上提交。:/ - logidelic

1
ls /tmp/filename.pid

如果文件存在,则返回true。如果文件不存在,则返回false。

1

您也可以使用像 Monit 这样的现成解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接