1

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

#!/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

4

1 回答 1

5

如何使用无限循环:

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

如果mplayer崩溃,它将由启动器脚本无限重启。

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

编辑:

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

  • 它由你终止。我假设您采取了合理的预防措施,不会错误地这样做——如果您这样做了,您可能会自己知道并修复它。如果这很关键,那么您应该以不同的用户身份运行脚本,以保护它免受大多数随机错误的影响。

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

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

    1. 无论您可能必须观看脚本的任何系统都可能会受到影响。

    2. 你有更大的鱼要炸——比如让系统重新上线。

    3. 您真的想要在有此类问题的盒子上自动处理任何东西吗?

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

  • 做对并不总是那么容易——尤其是如果,例如,同一程序(例如mplayer)可以有多个实例同时运行。

  • 如果您想出于某种原因将其关闭,您必须在感兴趣的进程之前禁用 cron 条目。

如果您真的很想在 的情况下重新启动启动器脚本<insert-favourite-catastrophe>,那么您可能应该使用适当的进程监控守护程序,例如:

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

http://mmoni.com/monit/

如果您认为没有矫枉过正之类的事情:

http://www.nagios.com/

http://www.opennms.org/

于 2011-01-28T08:46:30.880 回答