在bash中检测挂程序

时间:2012-04-18 21:56:17

标签: bash

我正在开发一个用于收听和录制mms流的应用程序;目前我正在用bash脚本为我的老板做一个概念验证。要录制,我想使用mimms:

mimms <mms://url> download_to_file

mimms的输出是:

connecting
<mms://url> <=> download_to_file
1MB / 10 MB (20 kB/s, 00:01:30 remaining)

最后一行是状态消息,每秒更新一次。

处理不稳定的网络时会出现问题。当网络退出时,mimms将挂起。没有向download_to_file添加新数据(文件大小是常量,并且不会增加),但是mimms不会退出,并且在重新建立网络连接时甚至不会恢复下载。它只是挂起,也不输出新的状态消息行。

我想在没有从mimms输出新行,杀死mimms并恢复下载时检测到它:

mimms -r mms://url download_to_file

但我不知道如何测试这些条件,并非常感谢如何处理这个问题的建议。

2 个答案:

答案 0 :(得分:2)

您可以在后台启动mimms(通过向命令添加&)并让您的脚本循环等待,定期检查下载文件的大小。如果mimms仍在运行但文件大小没有改变,则假设mimms挂起并将其终止。

答案 1 :(得分:0)

我自己想出了一个解决方案,它依赖于mimms的输出而不是mimms生成的文件的大小:

  1. 在后台启动程序,将输出从mimms重定向到日志文件
  2. 定期阅读该文件的最后一行
  3. 如果同一行连续两次出现,则杀死mimms并重新启动它
  4. 重复此操作直到mimms输出“Download complete!”

    LAST1="a"
    LAST2="b"
    MSG="Starting download of $PATH1"
    until [ "$LAST1" = "Download complete!" ]; do
        echo $MSG
        mimms -r $URL "$PATH1" >> log 2>&1 &
        PID=$!
        echo $PID
    
        until [ "$LAST1" = "$LAST2" ]; do
            LAST2="$LAST1"
            sleep 60
            LAST1=$(tail -1 log)
            echo "$LAST1"
        done
        kill $PID
        MSG="Download incomplete. Retry..."
    done