「&」を使用してLinuxシェルコマンドを実行する理由


30

Red Hat Linux Enterpriseバージョン5を&使用しています。いくつかのオプションでコマンドを実行している人がいることに気付きました。たとえば、次のコマンドには2つの&記号があります。それらの目的は何ですか?それらは常にnohupと一緒に使用されますか?

nohup foo.sh <script parameters> >& <log_file_name> &

回答:


15

マーティン、アッシュ、ケビンの回答に加えて、ビット単位のAND *にアンパサンドが数学的に使用されていることがあります。

$ echo $(( 11 & 7 ))
3

ビット演算子に慣れていない場合:

11: 1011
 7: 0111
-------- AND
 3: 0011

各位置には、最初の数字と2番目の数字に1ビットがあり、回答でそのビットを1に設定します。

* Kevinの答えの機能は、論理 AND と呼ばれます。

Ashの答えを詳しく説明すると、リダイレクトで使用する場合、アンパサンドはシェルにファイル記述子をコピーするよう指示できます。このコマンドでecho "hello" > outputfile 2>&1は、アンパサンドにより、標準エラー(stderr、ファイル記述子2)に到達する可能性のあるすべての出力が、標準出力(stdout、ファイル記述子1、左側のデフォルト)と同じ場所に移動します>>& outputfileオペレータは、の省略形です> outputfile 2>&1

また、バッシュ4に新しい、句のための2つの新たなターミネーターはであるcaseコマンド;&及び;;&場合は、次のテストが行われたかどうか、もしそうであれば、そして「から落下」かどうかに影響しています。


かっこいい、デニス!マシンにsshターミナルログを使用し、sshのターミナルを使用してコマンドを実行するとします(長期実行プロセスを想定)、ターミナルセッションを終了すると、コマンドの長期実行プロセスは正しく終了しますか?そして、シェルを終了してもコマンドを実行し続けたい場合、nohup、または&(コマンドの最後)またはnohupと&の両方を使用する必要がありますか?
ジョージ2

1
@ George2:いいえ、>& filenamestdoutとstderrの両方を同じファイルに出力します。stderrのみをリダイレクトする(およびstdoutをそのままにする)場合は、実行します2> filename。他の質問については、ほとんどの場合、nohupとの両方を使用し&ます。
追って通知があるまで一時停止します。

1
@ George2:コマンドをバックグラウンドにしないと、シェルプロンプトが表示されないため、logoutor exitコマンドを発行できます。
追って通知があるまで一時停止します。

2
George:&を使用しない場合、他のことをするようにプロンプ​​トが返されることはありません。端末は、プロセス(それが何であれ)が終了するか、終了/強制終了されるまで「ハング」します。&は、プロセスがバックグラウンドで実行されることを保証します。ただし、ログオフすると、オペレーティングシステムはすべてのプロセスを終了し、バックグラウンドプロセスも強制終了します。nohupを使用する と、プロセスに「終了するコマンドを無視してください」と伝えます。
マーティンマルコンチーニ

1
@ George2:はい。「ハングアップへの免疫」==「プロセスの継続」および「非tty」==「ターミナルコンソールセッションの終了」
通知があるまで一時停止します。

32

Bashシェルスクリプトでは、アンパサンド「&」を使用してプロセスを分岐します。

find -name hello &

これにより、findコマンドが分岐され、バックグラウンドで実行されます(PIDでいつでも強制終了できます)。


おかげでマーティン、私はマシンにsshターミナルログを使用し、sshのターミナルを使用してコマンドを実行すると仮定し(長時間実行プロセスを想定)、ターミナルセッションを終了するとコマンドの長期実行プロセスは正しく終了します?そして、sshターミナルで&を使用してコマンドを実行すると、ターミナルを終了しても、コマンドの長期実行プロセスはまだ実行されていますか?
ジョージ2

1
それは正しいジョージです。バックグラウンドプロセスは、終了するか終了するまで続行する必要があります。ただし、既に指摘したように、ユーザーがログオフしたときにプロセスが停止するのを避けるためにnohupが必要になります。
マーティンマルコンチーニ

マーティンありがとう!&とnohupの両方を使用する必要がある理由と、端末コンソールが終了してもコマンドを実行し続けるという目標を達成する個々の機能を知りたいと思います。nohupのmanページを読んで、「ハングアップの影響を受けないコマンドを実行し、非ttyに出力する」と書かれていますが、ハングアップの影響を受けないのは、終了の影響を受けずにコマンドを実行し続けるという意味ですか端末コンソール?もしそうなら、nohupを使用するだけで十分で、&を使用する必要はないと思います。コメントはありますか?
ジョージ2

1
Bothを使用する必要があります。&を使用しない場合、端末は他のコマンドを入力できません。あなたがそれを見る最良の方法は、それを試すことです。良い例は、検索のように時間がかかるコマンドです:find -name SomeName /> somefile.txt nohupと&で試して、違いを確認します。
マーティンマルコンチーニ

:これはnohupを質問のための偉大な答えていserverfault.com/questions/311593/...
joshperry

26

「&」を使用してLinuxシェルコマンドを実行する理由

プロンプトをすぐに戻すには、バックグラウンドでプロセスを実行します。

それらの機能は何ですか?

nohupを使用すると、ユーザーがログアウト(または開始シェルを終了)した後でも、バックグラウンドプロセスの実行を継続できます。

>&は 、標準出力と標準エラーの両方をログファイルにリダイレクトします。

すぐにあなたのプロンプト背中を与えて、バックグラウンドでの全体のことを実行します。

説明:

すべてのLinuxプロセスは、入力「stdin」、標準出力「stdout」、標準エラー出力「stderr」の3つのI / Oチャネルを開きます。バイナリに使用できますが、従来はテキストです。ほとんどのプログラムが標準入力を閉じると、プログラムは終了します(これはプログラマーが変更できます)。

親シェルが終了すると、子のstdinが閉じられ、(通常、通常)子も終了します。さらに、子はソフトウェアシグナルSIGHUPを受信します。これは、ユーザーが「電話を切った」ことを示します(以前のモデム)。ここでのデフォルトも終了します。(注意、プログラマーはプログラムを書くときにこれらすべてを変更できます)。

したがって、nohupは、子プロセスに個別のI / O環境を与え、親シェルに関連付けられていないものに入出力を結び付け、子をSIGHUP信号から保護します。ユーザーが切断すると、ユーザーのシェルではなく、initが所有するnohupバックグラウンドプロセス(プロセス1)が表示されます。

ただしnohup、プロセスがフォアグラウンドで実行されている場合、ジョブを完全に実行することはできないので&、バックグラウンドでプログラムを実行するために使用されます。


マシンにsshターミナルログを使用し、sshのターミナルを使用してコマンドを実行するとします(長期実行プロセスを想定)、ターミナルセッションを終了すると、コマンドの長期実行プロセスは正しく終了しますか?そして、シェルを終了してもコマンドを実行し続けたい場合、nohup、または&(コマンドの最後)またはnohupと&の両方を使用する必要がありますか?
ジョージ2

1
修正します。SSHが切断された後もプロセスを続行するには、nohupと&の両方を使用します。
kmarsh

ありがとうKmarsh!&とnohupの両方を使用する必要がある理由と、端末コンソールが終了してもコマンドを実行し続けるという目標を達成する個々の機能を知りたいと思います。nohupのmanページを読んで、「ハングアップの影響を受けないコマンドを実行し、非ttyに出力する」と書かれていますが、ハングアップの影響を受けないのは、終了の影響を受けずにコマンドを実行し続けるという意味ですか端末コンソール?もしそうなら、nohupを使用するだけで十分で、&を使用する必要はないと思います。コメントはありますか?
ジョージ2

1
回答を編集して回答します。
kmarsh

13

@Martinの答えに加えて:(>&上記の)アンパサンドのもう1つの用途は、stdoutとの両方をキャプチャすること stderrです。通常、「>」のみを使用して出力をファイルにリダイレクトした場合、出力はのみになり、stdoutエラーはありません。


1.ありがとう、Ash、 ">&<ログファイル名>"を確認して、すべてのstderrとstdoutをログファイルにダンプしますか?2.「> <log file name>」を使用すると、すべての標準出力がログファイルにダンプされますか?
ジョージ2

1
@ジョージ:はい、そうです。
アッシュ

ありがとう、アッシュ!&とnohupの両方を使用する必要がある理由と、端末コンソールが終了してもコマンドを実行し続けるという目標を達成する個々の機能を知りたいと思います。nohupのmanページを読んで、「ハングアップの影響を受けないコマンドを実行し、非ttyに出力する」と書かれていますが、ハングアップの影響を受けないのは、終了の影響を受けずにコマンドを実行し続けるという意味ですか端末コンソール?もしそうなら、nohupを使用するだけで十分で、&を使用する必要はないと思います。コメントはありますか?
ジョージ2

4

マーティンとアッシュの答えに加えて、&&トークンの使用が表示される場合があります。これは、「最初のコマンドが正常に実行された場合にのみ、2番目のコマンドを実行する」と言うために使用されます。適切に記述されたコマンドは、エラーがある場合、正常に終了しません。

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

かっこいい、ケビン!マシンにsshターミナルログを使用し、sshのターミナルを使用してコマンドを実行するとします(長時間実行プロセスを想定)、ターミナルセッションを終了すると、コマンドの長期実行プロセスは正しく終了しますか?そして、シェルを終了してもコマンドを実行し続けたい場合、nohup、または&(コマンドの最後)またはnohupと&の両方を使用する必要がありますか?
ジョージ2

どちらかが動作します。NOHUPはそれを行うための最初の方法でしたが、私は想像します(しかし、完全に推測しています)が、背景は今は機能しています。重要な違いは、リモートシステムに接続して対話型シェルを実行する場合です。NOHUPプロセスはフォアグラウンドで実行されますが、終了しても実行され続けますが、バックグラウンドプロセスはコマンドを生成した直後に戻ります。ただし、コマンドをバックグラウンドで実行して対話型シェルを終了しようとすると、最初に警告が表示されます。
ケビンM

2

マーティンの答えは良いですが、少しあいまいです。コマンドは常にフォークおよび実行されますが、通常のシェルの動作は、コマンドが終了するまで待機することです。アンパサンドはそれをバックグラウンドに置くので、ターミナルプロンプトが戻され、他のことができるようになります。プロセスがデータをstdoutまたはstderrに吐き出す場合、これはプロンプトで実行していることと混合され、混乱する可能性があります。>&/path/to/logfile.txtでリダイレクトするのはこのためです。

George2への応答として、終了するシェルの通常の動作は、SIGHUPシグナルを同じプロセスグループ内のすべてのプロセス(本質的に生成したもの)に送信することで、通常は終了します。シェルプロセスを閉じてもこれを続行したい場合は、nohupコマンドを使用して、このシグナルを無視して実行し続けることができます。このタイプのプロセスには特別な名前があり、デーモンプロセスと呼ばれます(「デーモン」と発音します)。


リッチありがとう!マシンにsshターミナルログを使用し、sshのターミナルを使用してコマンドを実行するとします(長時間実行プロセスを想定)、ターミナルセッションを終了すると、コマンドの長期実行プロセスは正しく終了しますか?そして、シェルを終了してもコマンドを実行し続けたい場合、nohup、または&(コマンドの最後)またはnohupと&の両方を使用する必要がありますか?なぜ?
ジョージ2

ちょっとジョージ、すみません、私はとても遅く応答しています。はい。シェルを終了すると、長期実行プロセスは終了します。続けて実行したい場合は、nohup(シェルが閉じたときに終了しないようにする)と&(バックグラウンドにするため、Crtl-Dまたはシェルを終了する)の両方を行う必要があります。また、setsidコマンドを見ると、プロセスを実行できるようになり、SIGHUPをわずかに異なる方法で無視できます。
リッチホモルカ

シェルが開始するバックグラウンドで実行されるプロセスのベストプラクティスについて説明します。
マルセルバルデスオロスコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.