首页 > 解决方案 > 检查文件是否存在在启动守护进程中不起作用

问题描述

好的,所以我有一个无头 Raspberry Pi,很久以前我创建了一个守护进程,让它在启动时播放声音效果,所以我知道它(希望)已经准备好进行 SSH 连接。

#!/bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start:    $local_fs $remote_fs $syslog
# Required-Stop:     $local_fs $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

case "$1" in
    start)
      omxplayer /home/pi/Music/boku\ satchii.mp3
    ;;
    stop)
    ;;
    restart)
      $0 start
    ;;
    status)
      echo "Running"
    ;;
    *)
      echo "Usage: $0 {start|stop|restart|status}"
      exit 1
    ;;
esac

exit 0

工作得很好。

现在我遇到的问题是 Pi 大约每月失去一次联网的能力(我放弃了试图找出原因)并且必须手动重新启动。为了解决这个问题,我在 crontab 中添加了每周重启一次,但它总是在每周六午夜用“BOKU SATCHII!”唤醒我,这在第一次出现的中途就不再有趣了。

我扔掉了一个快速的 shell 脚本,它使用“touch”来创建一个文件“/etc/quietboot”,然后重新启动。这很好用。我将它替换为 crontab 中的重新启动,然后我修改了守护程序,如下所示:

start)
  if [-e /etc/quietboot]; then
    sudo rm /etc/quietboot
  else
    omxplayer /home/pi/Music/boku\ satchii.mp3
  fi
;;

所以想法是,如果文件存在则应该删除它,如果它不存在则播放声音效果。我一直在测试它,它每次都只是播放音效,从不删除 quietboot 文件。我尝试将文件放在 home/pi/ 中,但得到了相同的结果。

我确定我在这里犯了一些基本错误,但我不确定它是什么。谁能帮我吗?

标签: bashscriptingdaemons

解决方案


关于你的说法:

if [-e /etc/quietboot]; then

你需要额外的空间:

if [ -e /etc/quietboot ]; then
#   ^                 ^
# here!            and here!

您当前的声明正在尝试运行[-e可执行文件并失败。此失败意味着该else块始终运行。

如果您尝试(从命令行),您实际上可以看到这一点:

pax> if [false] ; then echo it was false ; else echo it was true ; fi
[false]: command not found
it was true

pax> if [ false ] ; then echo it was false ; else echo it was true ; fi
it was false

推荐阅读