我写了一个简单的守护进程,请提示改进(bash/python-Ubuntu)

Jul*_*lio 1 bash daemon mplayer

我有一个bash脚本,基本上使用mplayer启动音频流:

#!/bin/bash
# startmusic.sh
/usr/bin/mplayer http://www.audiostream.com
Run Code Online (Sandbox Code Playgroud)

我想要确定的是,如果mplayer因任何原因而崩溃或结束,它会自动重启.因此,我每分钟运行一个cron作业,这也是一个bash脚本:

#!/bin/bash
# interval.sh
if [ -z "$(pgrep mplayer)" ]; then
 #restart music
 (
  exec </dev/null
  exec >/dev/null
  exec 2>/dev/null
  umask 0
  cd /
 bash /home/user/startmusic.sh
 ) &
else
 echo "music already playing, no need to restart startmusic.sh"         
fi
Run Code Online (Sandbox Code Playgroud)

使这个脚本不是很有用的一个奇怪的事情是,似乎mplayer正在启动2个实例,如果播放器停止(例如,当连接丢失时),只有1 mplayer实例退出,仍然留下一个.由于我的编程技巧非常简陋,我非常感谢任何(易于实现)的解决方案.在此先感谢/ J.

thk*_*ala 5

如何使用无限循环:

#!/bin/bash
# startmusic.sh
while :; do
    /usr/bin/mplayer http://www.audiostream.com
done
Run Code Online (Sandbox Code Playgroud)

如果mplayer崩溃,它将简单地由启动器脚本ad无限重启.

当然,这意味着mplayer如果你想永久地停止它,你必须首先杀死启动器脚本.

编辑:

像这样简单的脚本永远不会终止,除非发生以下情况之一:

  • 它由你终止.我假设你采取了合理的预防措施,不要误解 - 如果你这样做,你可能会自己知道并修复它.如果它至关重要的,那么你应该为不同的用户,以保护其免受最随意的错误运行该脚本.

  • shell脚本崩溃了.Bash 一些bug,就像其他任何软件一样,但我非常怀疑像循环一样简单的东西会导致一个新的东西出现.

  • 系统范围内发生了一些事情.内存不足,硬件问题甚至更常见的断电.在这种情况下:

    1. 无论您使用哪种系统,脚本都可能受到影响.

    2. 你有更大的鱼来炒 - 比如让系统重新上线.

    3. 你是否真的想要在有这些问题的盒子上自动捣乱?

使用cron监视进程有两个问题:

  • 要做到这一点并不总是那么容易 - 特别是例如,如果同一个程序(例如mplayer)可以同时运行多个实例.

  • 如果你想因任何原因关闭它,你必须在感兴趣的过程之前禁用cron条目.

如果您真的认真重新启动启动器脚本<insert-favourite-catastrophe>,那么您应该使用正确的进程监视守护进程,例如:

http://ps-watcher.sourceforge.net/

http://mmonit.com/monit/

如果你认为没有矫枉过正的事情:

http://www.nagios.com/

http://www.opennms.org/