web-dev-qa-db-ja.com

「<command>&disown」と「Nohup <command>&disown」の違い

これは、&disown、およびNohupの使用に関する私の理解です。

  • <command>:ターミナルの現在のbashインスタンス内でプロセスを実行します、フォアグラウンド(つまり、プロセスはbashフォアグラウンドジョブおよびstdinとしてリストされます) 、stdoutおよびstderrは、まだターミナルにバインドされています); ハングアップの影響を受けない;
  • <command> &:ターミナルの現在のbashインスタンス内でプロセスを実行します。バックグラウンド(つまり、プロセスはbashバックグラウンドジョブとstdinとしてリストされます) 、stdoutおよびstderrは、まだターミナルにバインドされています); ハングアップの影響を受けない;
  • <command> & disown:ターミナルの現在のbashインスタンス内でプロセスを実行します、バックグラウンドで、しかしプロセスはbashのジョブのリストからデタッチ(つまり、プロセスはbashフォアグラウンド/バックグラウンドジョブとしてリストされておらず、stdinstdout、およびstderrはまだにバインドされていますターミナル); ハングアップに対する免疫;
  • Nohup <command> & disown:ターミナルの現在のbashインスタンス内でプロセスを実行します、バックグラウンドで、しかしプロセスはbashのジョブのリストからデタッチ(つまり、プロセスはbashフォアグラウンド/バックグラウンドジョブとしてリストされておらず、stdinstdout、およびstderrnotまだ端末にバインド);ハングアップに耐性;

したがって、Nohup <command> & disownをブロックしてstdinをブロックし、デフォルトでstdoutstderrNohup.outにリダイレクトすることは別として、<command> & disownと完全に同等であると考えることができます。

上記はすべて正しいですか?誤解はありますか?

37
kos

あなたの理解は基本的に正しいです。 disownNohupの両方を使用して、実行中のジョブを停止せずに実行中のシェルセッションを終了できます。いくつかの説明:

  • Nohup command & disownを実行する理由はありません。Nohupは既にそれを無視しています。

  • NohupPOSIXで定義 ですが、disownではない です。これは、多くのシェル(たとえば、bashzshksh)が持っているが、他のシェル(たとえば、tcshcshdashおよびsh)はありません。

  • disownを使用できますafterNohupは前に使用する必要がありますが、コマンドを起動した後。

私が知る限り、2つのコマンドの実際の効果は同じです。それぞれに、他にはない機能があります(help disownおよびman Nohupを参照)が、基本的な機能は同じです。

これらのツールとそれらの違いの詳細については、こちらの回答をご覧ください。

27
terdon

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/nullcommandへの入力ファイルとして使用しています。たとえば、コマンドがcatである場合、cat /dev/nullとして使用しています。

5番目のポイントのコマンドは正しく配置されていません。Nohup <command> & disownを使用しましたが、Nohupまたはdisownのいずれかを使用し、もう一方は必要ありません。それらの目的は(SIGHUPを無視するため)同じですが、少し異なる方法で機能します。したがって、コマンドはNohup <command> &として簡略化できます。

7
heemayl