bgコマンドの奇妙な動作

bgコマンドの奇妙な動作

プロセス(アプリケーション)が常に端末への入力を期待し、常にuartからstdoutに受信したデータを送信する場合、プロセス(アプリケーション)をバックグラウンドで送信する方法は?

CTRL+Z と bg %number / bg %% を使用してアプリをバックグラウンドで送信することはできません。

どんなアイデアもありますか?何が起こっていますか?

マイデバイス(プログラム)がバックグラウンドで送信される前に設定するには、端末の一部の入力コマンドが必要です。バックグラウンドで送信しようとするとエラーが発生します。

# [CTRL-Z]
[1]+  Stopped                 sudo ./my_app

# bg %1

それは私に次のようなものを示しています:

[1]+  Stopped                 sudo ./my_app

答え1

バックグラウンドで実行されているプログラムが端末からデータを読み取ろうとするとSIGTTIN信号で停止。入力が現在フォアグラウンドプロセスに入っています。入力がフォアグラウンドまたはバックグラウンドプロセスにランダムに入ると、中断される可能性があります。したがって、バックグラウンドプログラムはフォアグラウンドにインポートされるまで一時停止します。

最初にプログラムにデータを渡す必要がある場合は、データをプログラムにパイプします。

echo "config=foo" | ./my_app &

時にはプログラムと対話する必要がありますが、ほとんどの場合、無人実行を続行できる場合はターミナルマルチプレクサで実行します。画面またはマルチプレクサ。画面を例に挙げましょう。

screen -S my_app ./my_app

必要な入力を入力し、Ctrl+を押してAスクリーンセッションを切り離します。つまり、バックグラウンドで実行中のままにして元の端末に戻ります。プログラムとやり取りするには、screenセッションに再接続してください。

screen -S my_app -rd

複雑な対話を自動化する必要がある場合は、次のようにします。予想されるスクリプト(または類似のライブラリを持つ他の言語のスクリプト)。

¹プロセスグループですが、ここでは詳しく扱いません。

答え2

コマンドが tty から読み取られ続ける場合は、以下を呼び出す必要があります。

fg

「中止」メッセージを受信した後に予想される入力を入力します。

答え3

stdinは引き続き機能するので、引数をstdinに渡すべきではありませんか? CTRL-Zを押すだけでバックグラウンドで入力を待ちます。

例えば

$ cat test.sh
#!/bin/bash

read var
echo $var

$ cat <<EOF > input
d
EOF

$ ./test.sh < input
d

$ ./test.sh <input > stdout 2> stderr &
[2] 23180
[2]-  Done                    ./test.sh < input > stdout 2> stderr

$ cat stdout
d

入力を渡さずに実行しようとしたとき:

$ ./test.sh > stdout 2> stderr &
[2] 13012

[2]+  Stopped                 ./test.sh > stdout 2> stderr

関連情報