「&」を使用してすでに分岐している場合、「nohup」が必要になるのはいつですか?


26

まず、この質問は関連していますが、間違いなくこの非常に素晴らしい質問と同じではありません。

nohup、disown、および&の違い

何かを理解したいのです。「&」を実行すると、正しく分岐しますか?

「nohup ...&」を実行するのは便利ですか、それとも単に&だけで十分ですか?

「&」を使用しているのに「nohup」を使用したいというケースを誰かが示すことができますか?


1
受け入れられた答えとそのコメントスレッドを読みましたか?彼らは何をするのか説明nohupします。どの部分が混乱していますか?
ジル 'SO-悪であるのをやめる

3
@Gilles:これらのことに慣れているので、あなたには明らかかもしれません(あなたの担当者を見ます)...しかし、最初に、私が置いたリンクの受け入れられた答えは、使用についての言葉を言いませんnohupと '&'の両方...私の質問は、他の質問と十分に明確で異なるものであると確信しています。)また、あなたは私が別の質問にリンクするために苦労したが、受け入れられた答えを読んでいないことを本当にほのめかしているのですか?
セドリックマーティン

回答:


32

まず、コマンドを実行するたびに、実行するかどうかに関係なく、シェルは新しいプロセスをフォークします&&バックグラウンドで実行していることを意味するだけです。

これはあまり正確ではないことに注意してください。いくつかのコマンドは、cdシェル関数であり、通常は新しいプロセスをフォークしません。type cmd通常cmd、外部コマンドかシェル関数かがわかります。それ自体がシェル関数であるtype typeことを伝えますtype

nohup何か違う。新しいプロセスに無視するよう指示しますSIGHUP。これは、親シェルが閉じられたときにカーネルによって送信される信号です。

質問に答えるには、次の手順を実行します。

  1. 実行emacs & (デフォルトでは個別のXウィンドウで実行する必要があります)
  2. 親シェルで、を実行しexitます。

emacsバックグラウンドで実行されているにもかかわらず、ウィンドウが強制終了されていることに気付くでしょう。これはデフォルトの動作であり、それnohupを正確に変更するために使用されます。

バックグラウンドでジョブを実行する(&またはでbg、他のシェルにも他の構文があることは間違いないでしょう)は、最新のシステムのマルチタスク機能に起因するシェル機能です。代わりに起動したいすべてのプログラム、近代的なシェルの新しいシェルのインスタンスをフォークの(bashzshksh、...)のプログラム(またはのリストを管理する機能があります仕事を)。フォアグラウンドに配置できるのは一度に1つだけです。つまり、シェルフォーカスを取得します。フォアグラウンドで実行されているプロセスとバックグラウンドで実行されているプロセスの違いを誰かがさらに拡大できることを願っています(メインのプロセスはstdin/ にアクセスしますstdout)。

いずれにせよ、これは子プロセスの反応に影響しませんSIGHUPnohupします。


素晴らしい答えを得るためにあなたの両方に+1 ...しかし、私はまだ混乱しています...私の質問に答える前にそれを試しました:多分私の(非常に古い)Debian Linuxセットアップは正しく設定されていませんが、そして、「exit」と入力すると、私のxtermのみが終了します。emacsはそのままです。
セドリックマーティン

Emacsは、SIGHUPを単独で処理できるほど複雑です。SIGHUPでプロセスが終了するのはデフォルトのみです。ntpdやinetdなどの多くの「デーモン」プログラムは、終了する代わりにSIGHUPで構成を再読み取りします。私はヴィムガイなので、emacsの経験はあまりありません。
ブルースエディガー

3
emacsについて特別なことは何もありません。シェルは通常、シェルが正常に終了したときではなくSIGHUP、シェル自体が受信したときに子プロセスに送信しSIGHUPます。bashには、終了時に子にhuponexit送信するオプションがありますSIGHUPが、デフォルトでは有効になっていません。 gnu.org/software/bash/manual/bashref.html#Signals
キース・トンプソン

こんにちは。まず第一に、素晴らしい説明。プロセスを実行して論文を検証し、を実行し&てシェルを閉じましたexit。プロセスはまだ実行中です。なぜ殺されていないかについてのアイデアはありますか?または、私はここで何かが欠けていますか?
アリ・ユルマズ

実行しているプロセスは何ですか?
rahmu

16

するのは便利ですnohup ... &か?はい。「バックグラウンド」でプロセスを開始する場合&、その新しいプロセスは元のシェルの「プロセスグループ」のメンバーシップを保持しています。そのシェルまたはプロセスグループが特定のシグナル(SIGHUPなど)を取得すると、デフォルトで終了します。これは&、xterm、rxvt、または他のウィンドウターミナルエミュレータによって起動されたシェルからプロセスを実行する場合、ウィンドウを閉じると、バックグラウンドプロセスがSIGHUPを取得することを意味します。カジュアルに記述されたコードのほとんどは、SIGHUPを処理しないため、終了します。

実行するnohup ... &と、nohupコマンドはSIGHUPを無視に設定し、コマンドを実行します。新しく実行されたコマンドはnohup、コマンドが何らかのシグナル処理を行わない限り、セットアップされたシグナルマスクを保持します。xtermまたはrxvtなどを閉じると、カーネルはコマンドのプロセスにSIGHUPを配信しますが、無視されます。走り続けます。

nohupコマンドに対してonを実行すると、xtermを閉じた後、またはログオフした後もコマンドを実行し続けることができます。


すみません-あなたは私を失いました。&with を使用すると、usingだけでnohupは実行nohupできない特定のインスタンスでコマンドが実行され続けると言っていますか?それはここの答えと矛盾するようです:unix.stackexchange.com/a/288064/1822
マイクB

2
@MikeB-「&」は、通常のfork / set things / execシステムコールを実行して、コマンドを「バックグラウンドで」実行します。つまり、nohuppedになるコマンドは非同期に実行されます。nohup前にいくつかのことを行いexec()フォークプロセスは、特定の信号を無視するためにシステムコール。そのため、はい、「&」を使用すると、特定の状況下でコマンドを実行nohupできます。nohupを実行したシェルに関連付けられたxtermを閉じる、またはログオフするようなものです。
ブルースエディガー

-1

Linuxオペレーティングシステムでバックグラウンドで(サフィックスとして&を付けて)プログラムを実行し、その後もログアウトし続ける場合は、実行を続けます:

  ping google.com > ping_result  &

ログイン後、出力ファイルの行数を確認してください。ping_result増加し続ける行は、まだ実行されていることを意味しますが、閉じられることが通知されています。その後、nohupコマンドの使用は何ですか。

別のシナリオ==>上で述べたようにnohup emac &->はemacシステムログアウト後も実行を続けるはずですが、ログイン後の実行は表示されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.