違いは何ですか
$ Nohup foo
そして
$ foo &
そして
$ foo &
$ disown
最初に、プログラムが&
なし(およびリダイレクトなし)で対話型シェル(端末に接続されている)から起動された場合に何が起こるかを見てみましょう。したがって、foo
と入力したと仮定します。
foo
を実行するプロセスが作成されます。SIGHUP
を受信すると、SIGHUP
もプロセスに送信します(これにより、通常はプロセスが終了します)。次に、プロセスをバックグラウンドで実行した場合、つまりfoo &
と入力するとどうなるかを見てみましょう。
foo
を実行するプロセスが作成されます。jobs
とともにリストされ、%n
を使用してアクセスできます(ここでn
はジョブ番号です)。fg
を使用してフォアグラウンドジョブに変換できます。その場合、&
を使用しなかったかのように続行されます(標準入力から読み取ろうとしたために停止した場合は、端末から読み取ります)。SIGHUP
を受け取った場合は、SIGHUP
もプロセスに送信します。シェル、および場合によってはシェルに設定されているオプションに応じて、シェルを終了するときにSIGHUP
もプロセスに送信します。ここでdisown
はシェルのジョブリストからジョブを削除するため、上記のすべてのサブポイントは適用されなくなります(シェルによってSIGHUP
が送信されるプロセスを含む)。ただし、それはstillが端末に接続されているため、端末が破壊された場合(xterm
によって作成されたようなptyの場合に発生する可能性があります)またはssh
、および制御プログラムは、xtermを閉じるか、または [〜#〜] ssh [〜#〜] 接続)を終了することによって終了します。プログラムは、読み取りを試みるとすぐに失敗します。標準入力または標準出力に書き込みます。
一方、Nohup
が行うことは、プロセスを端末から効果的に分離することです。
EOF
を受け取ります)。Nohup.out
にリダイレクトするので、端末が失敗してもプログラムは標準出力への書き込みに失敗せず、プロセスが書き込んだ内容が失われることはありません。SIGHUP
(したがって名前)を受け取るのを防ぎます。Nohup
はシェルのジョブ制御からプロセスを削除しないだけでなく、バックグラウンドにも置かないことに注意してください(ただし、フォアグラウンドNohup
ジョブはまたはあまり役に立たない場合は、通常、&
を使用してバックグラウンドに配置します。たとえば、disown
とは異なり、シェルはNohupジョブが完了したときに通知します(もちろん、シェルが以前に終了している場合を除きます)。
要約すると:
&
は、ジョブをバックグラウンドに配置します。つまり、入力を読み取ろうとするとジョブをブロックし、シェルがその完了を待機しないようにします。disown
は、シェルのジョブ制御からプロセスを削除しますが、ターミナルに接続されたままにします。結果の1つは、シェルがSIGHUP
を送信しないことです。もちろん、フォアグラウンドジョブの実行中には入力できないため、バックグラウンドジョブにのみ適用できます。Nohup
は、プロセスを端末から切断し、その出力をNohup.out
にリダイレクトして、SIGHUP
から保護します。効果の1つ(名前付け)は、プロセスが送信されたSIGHUP
を受信しないことです。これはジョブコントロールから完全に独立しており、原則としてフォアグラウンドジョブにも使用できます(ただし、それほど有用ではありません)。&
を使用すると、プログラムがバックグラウンドで実行されるため、プログラムが終了するまでブロックするのではなく、新しいシェルプロンプトが表示されます。 Nohup
とdisown
はほとんど無関係です。それらはSIGHUP(ハングアップ)シグナルを抑止するため、制御端末が閉じられたときにプログラムが自動的に強制終了されません。 Nohup
は、ジョブが最初に開始されたときにこれを行います。開始時にジョブをNohup
しない場合は、disown
を使用して実行中のジョブを変更できます。引数なしで現在のジョブを変更します。これはバックグラウンド化されたばかりのジョブです
これは、終了しないコマンド(例:tail
)に続いて、バックグラウンドでsofficeを実行しようとした私の経験です。この例では、sleep 100
を使用します。
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I see soffice logs/Ctrl-C soffice stop
#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I 表示されない soffice logs /を押す Ctrl-C 事務所停止
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
I see soffice logs/Ctrl-C soffice stop
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I see soffice logs /を押す Ctrl-C soffice 停止しません
スペースを節約するには:Nohup setsid ..
:ログを表示しない/ soffice DOES NOT STOP on Ctrl-CNohup
with & disown
with the end:does not show logs/soffice stop on Ctrl-C