これは、&
、disown
、およびNohup
の使用に関する私の理解です。
<command>
:ターミナルの現在のbash
インスタンス内でプロセスを実行します、フォアグラウンド(つまり、プロセスはbash
フォアグラウンドジョブおよびstdin
としてリストされます) 、stdout
およびstderr
は、まだターミナルにバインドされています); ハングアップの影響を受けない;<command> &
:ターミナルの現在のbash
インスタンス内でプロセスを実行します。バックグラウンド(つまり、プロセスはbash
バックグラウンドジョブとstdin
としてリストされます) 、stdout
およびstderr
は、まだターミナルにバインドされています); ハングアップの影響を受けない;<command> & disown
:ターミナルの現在のbash
インスタンス内でプロセスを実行します、バックグラウンドで、しかしプロセスはbash
のジョブのリストからデタッチ(つまり、プロセスはbash
フォアグラウンド/バックグラウンドジョブとしてリストされておらず、stdin
、stdout
、およびstderr
はまだにバインドされていますターミナル); ハングアップに対する免疫;Nohup <command> & disown
:ターミナルの現在のbash
インスタンス内でプロセスを実行します、バックグラウンドで、しかしプロセスはbash
のジョブのリストからデタッチ(つまり、プロセスはbash
フォアグラウンド/バックグラウンドジョブとしてリストされておらず、stdin
、stdout
、およびstderr
はnotまだ端末にバインド);ハングアップに耐性;したがって、Nohup <command> & disown
をブロックしてstdin
をブロックし、デフォルトでstdout
とstderr
をNohup.out
にリダイレクトすることは別として、<command> & disown
と完全に同等であると考えることができます。
上記はすべて正しいですか?誤解はありますか?
あなたの理解は基本的に正しいです。 disown
とNohup
の両方を使用して、実行中のジョブを停止せずに実行中のシェルセッションを終了できます。いくつかの説明:
Nohup command & disown
を実行する理由はありません。Nohup
は既にそれを無視しています。
Nohup
は POSIXで定義 ですが、disown
ではない です。これは、多くのシェル(たとえば、bash
、zsh
、ksh
)が持っているが、他のシェル(たとえば、tcsh
、csh
、dash
およびsh
)はありません。
disown
を使用できますafterNohup
は前に使用する必要がありますが、コマンドを起動した後。
私が知る限り、2つのコマンドの実際の効果は同じです。それぞれに、他にはない機能があります(help disown
およびman Nohup
を参照)が、基本的な機能は同じです。
これらのツールとそれらの違いの詳細については、こちらの回答をご覧ください。
stdin, stdout and stderr are still bound to the terminal
は正しい概念ではありませんが、最初から3番目のポイントは大丈夫なようです。 stdin
は、ターミナルまたはターミナルを使用する方法を介してコマンドにファイル名を常に入力するという意味で、常にターミナルにバインドされます。 stdout and stderr are still bound to the terminal
は大丈夫です。
4番目の点にstdin, stdout and stderr are not still bound to the terminal
がありますが、これは前の段落で述べたように正しくありません。また、ここでは、/dev/null
をcommand
への入力ファイルとして使用しています。たとえば、コマンドがcat
である場合、cat /dev/null
として使用しています。
5番目のポイントのコマンドは正しく配置されていません。Nohup <command> & disown
を使用しましたが、Nohup
またはdisown
のいずれかを使用し、もう一方は必要ありません。それらの目的は(SIGHUP
を無視するため)同じですが、少し異なる方法で機能します。したがって、コマンドはNohup <command> &
として簡略化できます。