2011-08-12 91 views
7

摘要:如何在後臺運行交互式任務?在後臺shell腳本中使用netcat/cat(如何避免停止(tty輸入)?)

詳細信息:我試圖在ash shell(Busybox)下運行這個簡單的腳本作爲後臺任務。

myscript.sh &

然而腳本立即停止...

[1] +停止(TTY輸入)myscript.sh

的MyScript可.sh內容...(只有相關部分,其他那麼我陷阱SIGINT,SIGHUP等)

#!/bin/sh 

catpid=0 

START_COPY() 
{ 
    cat /dev/charfile > /path/outfile & 
    catpid = $! 
} 

STOP_COPY() 
{ 
    kill catpid 
} 

netcat SOME_IP PORT | while read EVENT 
do 
    case $EVENT in 
    start) START_COPY;; 
    stop) STOP_COPY;; 
    esac 
done 

從簡單的命令行測試中,我發現bot cat和netcat試圖從tty讀取數據。 請注意,這個netcat版本沒有-e來停止tty。

現在可以做些什麼來避免myscript停止?

事情我試圖所以對於沒有任何成功:

1)的netcat /貓... <的/ dev/TTY(或tty輸出)

2)運行該塊含有貓和使用()在子shell中使用netcat。這可能會工作,但如何抓住貓的PID?

在你的專家...


的問題依然存在。 爲大家簡單的測試嘗試:

1)在一個終端運行的netcat -l -p 11111(不&)

2)在另一個終端運行netcat的本地主機11111 &(這應該後停止同時消息停止(TTY輸入))

如何避免這種情況?

+0

沒有更多的專家?任何想法? – LovelyVirus

+0

如果您可以從子流程中捕獲輸入和輸出,您可以使用'script'。如果這樣做不行,你可以嘗試研究['socat'](http://www.dest-unreach.org/socat/doc/socat.html);它具有先進的PTY處理功能,但我無法弄清楚如何獲得STDIN。 –

+0

illusatration是沒有工作的腳本的一部分。 socat不是我擁有的環境的選擇(不能在那裏獲得)。 已經厭倦了將/ dev/ttyS0重定向到netcat,它似乎正在工作,但它然後停止接收信號。 – LovelyVirus

回答

4

你確定你已經給你的腳本保持原樣嗎?或者你只是輸入一個粗略的傳真來說明一般的想法?在你的問題中的腳本有很多錯誤應該阻止它正確運行,這讓我感到驚訝。

  1. catpid=$!=周圍的空間使線不是有效的變量賦值。如果這是你的原始腳本,我很驚訝你沒有得到任何錯誤。

  2. kill catpid行會失敗,因爲字面詞catpid不是有效的作業ID。你可能想要kill "$catpid"

至於你的實際問題:

  • cat應該從/dev/charfile是閱讀,而不是從標準輸入或其他地方。你確定它試圖讀取tty輸入嗎?

  • 您是否嘗試過重定向netcat的輸入,如netcat < /dev/null如果您不需要netcat來讀取任何內容?

+0

不,這只是一個ilustration,正如你指出的那樣有錯別字。無論如何貓實際上是從/ dev/charfile中讀取(在命令行測試)。我只是假設netcat或cat導致Stopped(tty輸入)問題。還嘗試了netcat的/ dev/null,但沒有成功。 – LovelyVirus

9

你可能想netcat's "-d" option,告訴它不要從STDIN讀取。

6

我可以確認-d將幫助netcat在後臺運行。

我看到了同樣的問題有:

nc -ulk 60001 | nc -lk 60002 & 

我每次查詢的jobs,管道輸入將停止。

更改命令以下固定它:

nc -ulkd 60001 | nc -lk 60002 & 
1

我不得不使用不具有-d選項的netcat。

「echo -n | netcat ... &」似乎是一種有效的解決方法:即,如果您不需要使用它,立即關閉netcat的標準輸入。

0

由於這是沒有真正回答,如果使用Busybox的和-d選項不可用,以下命令將在發送給後臺保持netcat的「活着」:

tail -f /dev/null | netcat ... 

netcat < /dev/nullecho -n | netcat沒有工作爲了我。

相關問題