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
是我的新語言之一,建設性的批評是改進的最快方法。
你可以用'陷阱「殺$正品」 SIGHUP SIGINT SIGTERM'殺'tail'當腳本被殺害(除非'SIGKILL'死亡,但我們所有人都知道'SIGKILL'壞了)。否則,使用'['是過時的,使用雙方括號''[['。另一件事,'睡眠'只睡幾秒鐘!所以'睡覺.2'不可能做你所期望的。 –
呵呵,不知道'trap'命令......有時間做一些manpage搜索!關於「sleep.2」命令的話題,它正是我所需要的 - 睡眠時間爲1/5秒。我的睡眠狀態頁面指出:「與大多數需要NUMBER的實現不同,這裏NUMBER可能是一個任意的浮點數。」由於這是一個本地問題,我不必擔心平臺的特殊性。 – Kupiakos