【问题标题】:How can I check a file exists and execute a command if not?如何检查文件是否存在并在不存在时执行命令?
【发布时间】:2009-03-21 18:01:01
【问题描述】:

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

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

命令是

python daemon.py restart

必须从特定目录执行。

【问题讨论】:

  • 描述中的“必须从特定目录执行”部分听起来像是麻烦的秘诀。当心 - 如果可能,请重新考虑。
  • /tmp 是放置 PID 文件的错误位置,因为某些发行版具有从 /tmp 删除文件的更干净的进程,用户可能会从那里删除文件以腾出空间。

标签: linux shell


【解决方案1】:
[ -f /tmp/filename.pid ] || python daemon.py restart

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

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

||是一个类C的or,所以如果左边的命令失败,就执行右边的命令。

所以最后的声明说,如果/tmp/filename.pid 不存在,则启动守护进程。

【讨论】:

  • “常规文件”是什么意思?还有哪些其他选择?
  • @Barakuda - 非常规文件可以是目录、命名管道、网络套接字、字符设备、符号链接...
  • 必须是 && 而不是 ||
【解决方案2】:
test -f filename && daemon.py restart || echo "File doesn't exists"

【讨论】:

  • 如果只需要检查文件是否存在:test -f filename && echo "exists" || echo "不存在"
【解决方案3】:

如果您想知道的是 bash 脚本,那么这样的事情会起作用:

if [ ! -f "$FILENAME" ]; then
   python daemon.py restart
fi

更好的选择可能是查看lockfile

【讨论】:

    【解决方案4】:

    其他答案可以很好地检测文件的存在。但是,对于一个完整的解决方案,您可能应该检查 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
      

      这样,服务器即使意外死机也能保持活力。

      【讨论】:

      • if [ ! -f "$PIDFILE" ]; then 实际上应该是 if [ -f "$PIDFILE" ]; then。我试图编辑它,但是对于stackoverflow来说编辑太小了。 ://
      【解决方案6】:

      您也可以使用现成的解决方案,例如Monit

      【讨论】:

        【解决方案7】:
        ls /tmp/filename.pid
        

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

        【讨论】:

          猜你喜欢
          • 2015-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-07
          • 2016-04-15
          • 1970-01-01
          • 1970-01-01
          • 2018-02-15
          相关资源
          最近更新 更多