2013-07-17 45 views
1

標準輸出我有以下代碼:重定向標準輸入,同時等待後臺進程

cmd cmd_args & WAIT_PID=$! 

trap "kill -s SIGTERM $WAIT_PID" SIGTERM SIGINT SIGKILL 

wait $WAIT_PID 

有了這個,我希望能夠殺死任何後臺進程,每當有人試圖殺死這個腳本。但是,我仍然希望stdin被重定向到後臺進程,這不會發生。

我想抓住wait的stdin並將其重定向到後臺進程。爲此,我試過:

wait $WAIT_PID 0>&1 1> named_pipe 

但沒有任何運氣。

+0

僅供參考,您不能捕獲'SIGKILL '。 – chepner

回答

1

如上所述,您不能陷阱SIGKILL(或SIGSTOP)。

除此之外,試試這個:

#!/bin/bash 
cmd cmd_args <&0 & 
wait_pid=$! 
trap "kill -s SIGTERM $wait_pid" SIGTERM SIGINT 
wait $wait_pid 

<&0會告訴你想cmd的bash的標準輸入是腳本的標準輸入。

稍微偏離主題,但傾倒字節到正在運行的進程的標準輸入的另一個有趣的方法是直接將它們發送到它的/proc文件描述符,如:

echo "Stuff to send to the process" >/proc/$wait_pid/fd/0 
+0

我試過你的解決方案,它不起作用。是不是'<&0'與'0 <&0'相同?它有什麼作用嗎? –

+0

它與'0 <&0'相同,是的,如果您使用該命令,則會產生影響。沒有它,後臺命令將不會從腳本的stdin中讀取。至於它不適合你,請嘗試使用'cat <&0&'作爲命令的上述腳本,然後開始輸入隨機行。您會注意到這些行被'cat'複製,證明它從標準輸入讀取(如預期的那樣)。你也可以在不用'<&0'的情況下試一下,看看有什麼不同。 –