これらの4つのコマンドをXubuntu16.04でローカルまたはsshを介して実行すると、すべてまったく同じことを実行しているように見えます。
export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
-
gedit &
-
gedit & disown
-
nohup gedit
-
nohup gedit & disown
私はしませんgedit &
とgedit & disown
の違いを確認してください。親端末を強制終了するか、sshセッションからログアウトすると、次のようになります。 geditはどちらのシナリオでも「否認」されます。
2つと3つについては、コマンド出力が別のファイルに記録され、次の場合でも引き続きその別のログに記録されるという違いがあります。 bgプロセスを生成した元のシェルセッションが強制終了されます。
3つと4つについては、技術的な違いがあることを読み続けていますが、なぜ一方を他方よりも優先するのかまったく理解できません。
どちらを使用すればよいですか?チュートリアルとQ &で使用される4つのコマンドすべてを見てきました。そして、nohupとdisownの技術的な違いを説明するいくつかの非常に優れた回答にもかかわらず、「ロギングの目的やシェルの互換性を除いて)どの推奨事項を使用すべきか明確な推奨事項を得ることができないようです。
コメント
- シェルで続行する場合(およびプログラムがそれ自体をフォークしない場合)は、すべて&が必要です。ファイル記述子を閉じて関連付けを解除するプログラムには、nohupは必要ない場合があります(つまり、GibtはほとんどのGUIアプリケーションに当てはまります)。事後に(nohupを忘れた場合)、GUIアプリがそれを必要としない前に書かれたように、disownを使用できます。
回答
長時間実行されるスクリプトを実行する必要がある場合、 ssh
セッションの場合、次のいずれかが必要です。
-
ネットワークが切断された場合、またはラップトップを梱包して離れた場合でも、タスクは続行されます。 。
a。タスクは私からのインタラクティブな入力なしで終了できます。
nohup do_my_stuff &
b。タスクにはstdinで私からの何かが必要な場合があります。
man tmux history -w tmux do_my_stuff
-
バックグラウンドプロセスは、現在のセッションを何らかの形で強化しており、セッションと一緒に終了する必要があります。まれです。
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
-
sshセッションでログをランダムに吐き出したいのですが、待ってください。いいえ、絶対に必要ありません。ありがとうございます。あなた
disown
。 -
もう1つ絶対に欲しくないこと:変換完全に切り離されたデーモンへのプロセスですが、次回の起動時に自動的に開始することは避けてください。システムがいつ再起動し、誰が再起動するかを予測できないため、これは絶対に必要ありません。
回答
通常、私は次のことを行います:
-
myprog &
からバックグラウンドで何かを実行したい場合私の現在のログインシェル。これは99%の確率で私には十分です… -
nohup myprog > /my/path/output.txt &
シェルから何かを開始したいが、後でログアウトします(おそらくバックグラウンドタスクの実行中に)。
回答
あなたシェルの終了とターミナルの中止を区別する必要があります。
- シェルは、中止信号を受信すると、すべての既知のジョブ(子は除く)を強制終了します。
- 端末は強制終了します。それが制御端末であったすべてのもの。
一般的に(ユーザーレベルで)最良の解決策はscreen
です。
タスクがユーザー関連ではなくシステム関連である場合は、手動で開始する代わりにsystemdサービスにすることができます。