2016-08-19 42 views
0

我使用socat在端口上發佈stdin中的數據。簡而言之:socat - 在使用分叉選項時在STDIN EOF上終止

some_process | socat -u - tcp-listen:8888,reuseaddr,fork 

我想管道活着,在端口8888的讀者來來去去,因此的選擇,但我也想socat終止,如果some_process模具。目前它在這種情況下仍然活着。

一個簡單的測試的情況是:

while : ; do echo 1; sleep 1; done | socat -u - tcp-listen:8888,reuseaddr,fork 

其給出該處理樹(經由pstree):

bash─┬─bash───sleep 
    └─socat 

如果我殺第二bash的(這是運行在while循環),那麼我得到:

bash───socat 

我想socat有終止ALS O操作。我想要什麼?

回答

0

要回答我自己的問題,它看起來像我想要的是不可能的。

從文檔(xio.help):

選項:叉

沒有叉(或叉= 0),聽音過程接受正好一個 連接,並終止之後。使用叉子設置,它會爲每個傳入連接分配一個新的社區子進程。

父進程保留在accept()和fork()調用的循環中,直到 從外部終止。

我工作圍繞這一問題通過與FIFO連接我的兩個過程:

mkfifo /tmp/myfifo 
socat -u - tcp-listen:8888,reuseaddr,fork < /tmp/myfifo & 
socat_pid=$! 
some_process > /tmp/myfifo 
(some_process terminates for some reason) 
kill $socat_pid 
rm /tmp/myfifo