まず、この質問は関連していますが、間違いなくこの非常に素晴らしい質問と同じではありません。
何かを理解したいのです。「&」を実行すると、正しく分岐しますか?
「nohup ...&」を実行するのは便利ですか、それとも単に&だけで十分ですか?
「&」を使用しているのに「nohup」を使用したいというケースを誰かが示すことができますか?
まず、この質問は関連していますが、間違いなくこの非常に素晴らしい質問と同じではありません。
何かを理解したいのです。「&」を実行すると、正しく分岐しますか?
「nohup ...&」を実行するのは便利ですか、それとも単に&だけで十分ですか?
「&」を使用しているのに「nohup」を使用したいというケースを誰かが示すことができますか?
回答:
まず、コマンドを実行するたびに、実行するかどうかに関係なく、シェルは新しいプロセスをフォークします&
。&
バックグラウンドで実行していることを意味するだけです。
これはあまり正確ではないことに注意してください。いくつかのコマンドは、cd
シェル関数であり、通常は新しいプロセスをフォークしません。type cmd
通常cmd
、外部コマンドかシェル関数かがわかります。それ自体がシェル関数であるtype type
ことを伝えますtype
。
nohup
何か違う。新しいプロセスに無視するよう指示しますSIGHUP
。これは、親シェルが閉じられたときにカーネルによって送信される信号です。
質問に答えるには、次の手順を実行します。
emacs &
(デフォルトでは個別のXウィンドウで実行する必要があります)。exit
ます。emacs
バックグラウンドで実行されているにもかかわらず、ウィンドウが強制終了されていることに気付くでしょう。これはデフォルトの動作であり、それnohup
を正確に変更するために使用されます。
バックグラウンドでジョブを実行する(&
またはでbg
、他のシェルにも他の構文があることは間違いないでしょう)は、最新のシステムのマルチタスク機能に起因するシェル機能です。代わりに起動したいすべてのプログラム、近代的なシェルの新しいシェルのインスタンスをフォークの(bash
、zsh
、ksh
、...)のプログラム(またはのリストを管理する機能があります仕事を)。フォアグラウンドに配置できるのは一度に1つだけです。つまり、シェルフォーカスを取得します。フォアグラウンドで実行されているプロセスとバックグラウンドで実行されているプロセスの違いを誰かがさらに拡大できることを願っています(メインのプロセスはstdin
/ にアクセスしますstdout
)。
いずれにせよ、これは子プロセスの反応に影響しませんSIGHUP
。nohup
します。
SIGHUP
、シェル自体が受信したときに子プロセスに送信しSIGHUP
ます。bashには、終了時に子にhuponexit
送信するオプションがありますSIGHUP
が、デフォルトでは有効になっていません。 gnu.org/software/bash/manual/bashref.html#Signals
&
てシェルを閉じましたexit
。プロセスはまだ実行中です。なぜ殺されていないかについてのアイデアはありますか?または、私はここで何かが欠けていますか?
するのは便利です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
nohup
前にいくつかのことを行いexec()
フォークプロセスは、特定の信号を無視するためにシステムコール。そのため、はい、「&」を使用すると、特定の状況下でコマンドを実行nohup
できます。nohupを実行したシェルに関連付けられたxtermを閉じる、またはログオフするようなものです。
Linuxオペレーティングシステムでバックグラウンドで(サフィックスとして&を付けて)プログラムを実行し、その後もログアウトし続ける場合は、実行を続けます:
ping google.com > ping_result &
ログイン後、出力ファイルの行数を確認してください。ping_result
増加し続ける行は、まだ実行されていることを意味しますが、閉じられることが通知されています。その後、nohup
コマンドの使用は何ですか。
別のシナリオ==>上で述べたようにnohup emac &
->はemac
システムログアウト後も実行を続けるはずですが、ログイン後の実行は表示されません。
nohup
します。どの部分が混乱していますか?