2012-11-17 108 views
1

我试图设置一个IO脚本来允许两个FIFO之间的输入/输出通信(一个FIFO用于输入,另一个用于输出)。确保bash中的进程被破坏? (可能捕获SIGINT)

当我输入输入时,我的服务器需要接收输出。 FIFO和Internals/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是我的新语言之一,建设性的批评是改进的最快方法。

+0

你可以用'陷阱“杀$正品” SIGHUP SIGINT SIGTERM'杀'tail'当脚本被杀害(除非'SIGKILL'死亡,但我们所有人都知道'SIGKILL'坏了)。否则,使用'['是过时的,使用双方括号''[['。另一件事,'睡眠'只睡几秒钟!所以'睡觉.2'不可能做你所期望的。 –

+0

呵呵,不知道'trap'命令......有时间做一些manpage搜索!关于“sleep.2”命令的话题,它正是我所需要的 - 睡眠时间为1/5秒。我的睡眠状态页面指出:“与大多数需要NUMBER的实现不同,这里NUMBER可能是一个任意的浮点数。”由于这是一个本地问题,我不必担心平台的特殊性。 – Kupiakos

回答

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