确保在bash中破坏进程? (可能会抓住SIGINT)

时间:2012-11-17 19:12:38

标签: bash sigint

我正在尝试设置IO脚本以允许两个FIFO之间的输入/输出通信(一个FIFO用于输入,另一个用于输出)。

当我输入输入时,我的服务器必须接收输出。 Internals/servoutInternals/servin都是FIFO。我目前通过在等待输入时在后台运行tail来实现此目的。

这是我目前的代码:

#!/bin/bash
# io.sh

tail -f -n 0 Internals/servout &
tpid=$!

read -p ">> " v
while [ $? -eq 0 ] && [ "$v" != "exit" ] && [ "$v" != "quit" ]; do
        echo $v > Internals/servin
        sleep .2
        read -p ">> " v
done

kill $tpid

我遇到的主要问题是我不小心输入Ctrl-C来结束我的脚本。发生这种情况时,tail -f -n 0 Internals/servout &代码将继续在后台运行。正如您可能想象的那样,这是不可取的。

有没有办法确保tail命令被杀死,即使发送了SIGINT或类似的信号?我正在思考一些与Python中的finally关键字具有相同目的的东西,或者使用tail使$$命令依赖于当前脚本的过程。

随意评论我的不良做法 - bash是我的新语言之一,建设性的批评是最快的改进方式。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

#!/bin/bash
# io.sh

cleanup() {
    [[ -n $tpid ]] && kill $tpid
}

trap 'cleanup' SIGHUP SIGINT SIGTERM EXIT

tail -f -n 0 Internals/servout &
tpid=$!

quitflag=0
while ((!quitflag)) && read -p ">> " v; do
    case $v in
        exit | quit)
            quitflag=1
            ;;
        help | '?')
            echo "Sorry, I can't help you."
            ;;
    esac
    echo "$v" > Internals/servin
done