2012-11-17 102 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