まず、この質問は関連していますが、次のような非常に良い質問とはかなり異なります。
一つ理解したいことがあります。 「&」をする時にフォークをするということです。そうですか?
"nohup ... &"タスクは動作しますか、それともシンプルで十分ですか?
「&」を使用していますが、まだ「nohup」を使用したい状況を誰かが表示できますか?
答え1
まず、シェルは実行するかどうかにかかわらず、コマンドを実行するたびに新しいプロセスを分岐します&
。&
バックグラウンドで実行中という意味です。
これはあまり正確ではありませんのでご注意ください。シェル機能などの一部のコマンドはcd
通常、新しいプロセスを生成しません。これは通常、外部コマンドかシェル機能かを示しますtype cmd
。シェル関数自体であることをお知らせします。cmd
type type
type
nohup
何か違うと思います。新しいプロセスに無視するように指示しますSIGHUP
。親シェルが閉じたときにカーネルが送信する信号です。
ご質問にお答えするには:
- 走る
emacs &
(デフォルトでは別々のXウィンドウで実行する必要があります)。 - 親シェルでを実行します
exit
。
emacs
ウィンドウがバックグラウンドで実行されているが終了したことがわかります。これはデフォルトの動作なので、nohup
これを修正するために使用してください。
バックグラウンドでタスクを実行すること(&
または使用bg
、他のシェルには異なる構文があるでしょう)は、現代のシステムのマルチタスク機能に由来するシェルの機能です。最新のシェル(bash
、、、、...)はプログラムリスト(またはzsh
ksh
働く)。一度に一人しかいません。展望、これはシェルフォーカスを取得することを意味します。私は誰かがフォアグラウンドで実行されているプロセスとバックグラウンドで実行されているプロセス(主にstdin
/アクセスstdout
)の違いについてより多くの情報を提供できることを願っています。
いずれにせよ、これはサブプロセスのペアがどのように反応するかには影響しませんSIGHUP
。nohup
する。
答え2
これは役に立ちますかnohup ... &
?はい。 In Backgroundを使用してプロセスを開始した場合、&
新しいプロセスはまだ元のシェルのプロセスグループに属しています。シェルまたはプロセスグループが特定の信号(SIGHUPなど)を受信すると、デフォルトでシャットダウンされます。これは&
、xterm、rxvt、または他のウィンドウ端末エミュレータによって起動されたシェルでプロセスを実行すると、ウィンドウを閉じるとバックグラウンドプロセスがSIGHUPを受け取ることを意味します。ほとんどのランダムに書かれたコードはSIGHUPを処理しないので終了します。
これにより、コマンドnohup ... &
はnohup
SIGHUPを無視するように設定してからコマンドを実行します。新しく実行されたコマンドは、nohup
コマンド自体がいくつかの信号処理を実行しない限り、設定された信号マスクを保持します。 xtermやrxvtなどを閉じると、カーネルはSIGHUPをコマンドプロセスに渡し、シグナルは無視されます。引き続き実行されます。
コマンドを実行すると、nohup
xtermを閉じるかログアウトした後もコマンドが実行され続けます。
答え3
ここで言及されていないことの1つは、「ターミナル終了時にHUPを送信」イベントが設定可能であることです。これは起こるかもしれないし、起こらないかもしれません。これはnohup
、タスクの実行方法に関する一部の人々の認識を混乱させる可能性があります。ターミナル終了時にHUP転送が無効になっていると、nohup
不要な結論が導き出されます。ターミナル終了時にHUPを送信するのはbashのシェルオプションです。
努力する
shopt | grep huponexit
端末が終了したときにHUPが送信されるかどうかを示します。その場合、nohupを使用する必要があります。そうでなければそうではありません。
答え4
Linux オペレーティング・システム (サフィックスに & が付く) でバックグラウンドで実行されているプログラムがあり、ログアウトした後も実行が続く場合: 以下を試してください。
ping google.com > ping_result &
再ログインすると、確認出力ファイルの行数がping_result
増え続けます。つまり、ファイルはまだ実行中ですが終了するように求められます。それでは、コマンドの用途は何ですかnohup
?
別の例では、==>上記のようにnohup emac &
-->emac
システムログアウト後も実行を続ける必要がありますが、再度ログインした後は表示されません。