バックグラウンドプロセスの出力を表示できるのはなぜですか?


31

たとえば、を入力するとping 8.8.8.8 &、pingプロセスが動作しているのを見ることができます と入力するとfind / -name '*test*' &、モニターにも表示されます。

何故ですか?それは本当にバックグラウンドではありませんか?

回答:


43

&非同期に、ジョブとしてバックグラウンドでコマンドを実行するためのシェル、すなわち、それはフォークと別々のサブシェルで実行されたが、指示します。

あなたが置くときことに注意してください&両方-出力stdoutとstderrを -まだされ、スクリーン上に印刷。あなたは、画面上の任意の出力を表示したくない場合は、両方をリダイレクトするstdoutstderrしてファイルへ:

myscript > ~/myscript.log 2>&1 &

通常、エラーを後で分析する必要がない場合はstderr、リダイレクトして破棄する/dev/nullことができます。

別のサブシェルでコマンド/スクリプトを同時に実行することもできます。例えば;

./script1 & ./script2 & ./script3 & 

バックグラウンドジョブは、コマンドで終了する前にコマンドラインに戻すことができます。

fg <job-number>

job-number実行すると取得できます

jobs

いい答えだ。/dev/null出力をどこかに保存せずに破棄したい場合は、端末出力をリダイレクトするファイルとして使用できることを含めることができます。そして、私はそれが2>&1リダイレクトさstderrれるのは正しいstdoutですか?たぶんあなたもそれを明確にしたい...ありがとう。
バイトコマンダー

@ByteCommanderありがとう:) はい、あなたは正しい、に 2>&1リダイレクトstderrstdoutます。
ロン

3
stty tostopターミナルへの書き込みを試みると、バックグラウンドジョブが中断されることに言及する価値があると思います。
カスペルド

cmd_with_params> / dev / null 2> / dev / null&
tgkprog

これを行う唯一の欠点は、stdoutとstderrへの出力の順序がログファイルで混同される可能性があることです。
matthieu

8

を使用する&と、プロセスはバックグラウンドで実行されます。しかし、その標準出力はまだ端末です。

実際には、あなたが実行することping 8.8.8.8 &find / -name '*test*' &同時に(混合出力が得られる)、しかし、あなたは実行されないことping 8.8.8.8find / -name '*test*'同じシェル上で同時に。

何も表示したくない場合は、などを使用しますping 8.8.8.8 &> /dev/null &


また、あなたが学びたいことnohupdisown


disown出力が端末に出力されるのを妨げません。
ルスラン

@Ruslan:いいえ。ただし、シェルからジョブを削除します。どちら(あるいはない場合があります)OPがに興味がある可能性があり、何かこと。
アンドレアCorbellini
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.