Shell脚本:如果进程(使用管道)重新启动,如何重启

时间:2014-09-10 19:46:52

标签: bash shell sh

我目前使用How do I write a bash script to restart a process if it dies? lhunath中描述的技术来重启死进程。

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

但我不想只是调用 myserver 进程,而是想调用这样的东西:

 myserver 2>&1 | /usr/bin/logger -p local0.info &

如何在管道进程中使用第一种技术?

2 个答案:

答案 0 :(得分:4)

until循环本身可以通过管道传输到logger

until myserver 2>&1; do
    echo "..."
    sleep 1
done | /usr/bin/logger -p local0.info &

因为myserver从循环(继承自shell)继承了它的标准输出和错误。

答案 1 :(得分:1)

您可以使用PIPESTATUS变量从管道中的特定命令获取退出代码:

while :; do
    myserver 2>&1 | /usr/bin/logger -p local0.info
    if [[ ${PIPESTATUS[0]} != 0 ]]
    then echo "Server 'myserver' crashed with exit code ${PIPESTATUS[0]}.  Respawning.." >&2
         sleep 1
    else break
    fi
done