我有一个基本上使用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
答案 0 :(得分:5)
如何使用无限循环:
#!/bin/bash
# startmusic.sh
while :; do
/usr/bin/mplayer http://www.audiostream.com
done
如果mplayer
崩溃,它将由启动器脚本 ad infinitum 重新启动。
当然,这意味着您必须先杀死启动器脚本,然后再mplayer
,如果您希望永久停止它。
编辑:
这个简单的脚本永远不会终止,除非发生下列情况之一:
它终止了你。我假设你采取了合理的预防措施,不要误解 - 如果你这样做,你可能会自己知道并修复它。如果 至关重要,那么您应该以不同的用户身份运行该脚本,以防止出现大多数随机错误。
shell脚本崩溃。 Bash 有有一些错误,就像任何其他软件一样,但我非常怀疑像循环那样简单的东西会导致一个新的东西出现。
系统范围内发生了一些事情。内存不足,硬件问题甚至更常见的断电。在那种情况下:
无论您使用哪种系统,脚本都可能受到影响。
你有更大的鱼来炒 - 比如让系统重新上线。
你真的希望在这个问题的盒子上自动捣乱吗?
使用cron监控流程有两个问题:
要做到这一点并不总是那么容易 - 特别是例如,同一个程序可能有多个同一程序实例(例如 mplayer )同时运行。
如果您想因任何原因将其关闭,您必须在感兴趣的过程之前禁用cron条目。
如果您真的想要在 <insert-favourite-catastrophe>
的情况下重新启动启动器脚本,那么您应该使用正确的进程监视守护进程,例如:
http://ps-watcher.sourceforge.net/
如果你认为没有矫枉过正的事情: