11

要約: インタラクティブなタスクをバックグラウンドで実行するには?

詳細: この単純なスクリプトを ash シェル (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 バージョンには、tty を抑制するための -e がないことに注意してください。

myscript が停止しないようにするにはどうすればよいでしょうか。

私が成功せずに試したこと:

1) netcat/cat ... < /dev/tty (または の出力tty)

2) () を使用してサブシェルで cat と netcat を含むブロックを実行します。これはうまくいくかもしれませんが、猫のPIDを取得する方法は?

あなたの専門家に...


問題はまだ存在します。皆さんが試す簡単なテスト:

1) 1 つのターミナルで netcat -l -p 11111 を実行します (& なし)

2) 別のターミナルで netcat localhost 11111 & を実行します (これはしばらくすると停止し、Stopped (TTY input) というメッセージが表示されます)

これを回避する方法は?

4

6 に答える 6

9

-dバックグラウンドでの netcat の実行に役立つことを確認できます。

私は同じ問題を見ていました:

nc -ulk 60001 | nc -lk 60002 &

を照会するたびjobsに、パイプ入力が停止します。

コマンドを次のように変更すると修正されました。

nc -ulkd 60001 | nc -lk 60002 &
于 2013-06-19T06:04:24.203 に答える
4

スクリプトをそのまま渡したのですか、それとも一般的なアイデアを説明するための大まかなコピーを入力しただけですか? あなたの質問のスクリプトには多くのエラーがあり、正しく実行できなくなるはずです。

  1. =inの周りのスペースcatpid=$!により、その行は有効な変数割り当てではなくなります。それが元のスクリプトにあった場合、エラーが発生していないことに驚いています。

  2. kill catpidリテラル ワードcatpidは有効なジョブ ID ではないため、この行は失敗するはずです。あなたはおそらくしたいですkill "$catpid"

あなたの実際の質問については:

  • cat/dev/charfile標準入力やその他の場所からではなく、から読み取る必要があります。tty 入力を読み取ろうとしていたのは確かですか?

  • 何も読む必要がないかnetcatのように、 の入力をリダイレクトしようとしましたか?netcat < /dev/nullnetcat

于 2011-08-12T16:16:17.383 に答える
1

-d オプションのない netcat を使用する必要があります。

"echo -n | netcat ... &" は効果的な回避策のようです: つまり、netcat への標準入力を使用する必要がなければ、すぐに閉じます。

于 2013-11-19T10:33:56.817 に答える
0

まだ実際には回答されていないため、Busybox と -d オプションを使用できない場合、次のコマンドは、バックグラウンドに送信されたときに netcat を「有効」に保ちます。

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

netcat < /dev/null私にはうまくいきecho -n | netcatませんでした。

于 2016-02-24T08:51:58.207 に答える