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

时间:2011-01-28 08:42:37

标签: bash daemon mplayer

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

#!/bin/bash
# startmusic.sh
/usr/bin/mplayer http://www.audiostream.com

我想确定的是,如果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

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

1 个答案:

答案 0 :(得分:5)

如何使用无限循环:

#!/bin/bash
# startmusic.sh
while :; do
    /usr/bin/mplayer http://www.audiostream.com
done

如果mplayer崩溃,它将由启动器脚本 ad infinitum 重新启动。

当然,这意味着您必须先杀死启动器脚本,然后再mplayer,如果您希望永久停止它。

编辑:

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

  • 它终止了你。我假设你采取了合理的预防措施,不要误解 - 如果你这样做,你可能会自己知道并修复它。如果 至关重要,那么您应该以不同的用户身份运行该脚本,以防止出现大多数随机错误。

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

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

    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/