web-dev-qa-db-ja.com

Bashを使用するデスクトップでは、「&」、Nohup、disown、またはこれら3つの組み合わせを使用してプロセスを開始し、完全に単独で実行する必要がありますか?

Xubuntu 16.04でこれらの4つのコマンドをローカルまたはssh経由で実行すると、まったく同じように動作するようです。

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
  1. gedit &
    
  2. gedit & disown
    
  3. Nohup gedit
    
  4. Nohup gedit & disown
    

gedit &gedit & disownの違いはわかりません。親ターミナルを強制終了したり、sshセッションからログアウトしたりすると、どちらのシナリオでもgeditが「取り消された」ように見えるためです。

2つと3つについては、唯一の違いは、コマンド出力が別のファイルに記録され、bgプロセスを生成した元のシェルセッションが強制終了されても、その別のログに引き続き記録されることです。

3つと4つについては、技術的な違いがあることを読み続けていますが、なぜどちらを優先するのか、まったく理解できません。

どちらを使用する必要がありますか?チュートリアルとQ&Aで使用される4つのコマンドすべてを見てきましたが、Nohupとdisownの技術的な違いを説明する非常に優れた回答にもかかわらず、明確な推奨を得ることができません(おそらく、ログ記録の目的またはシェルの互換性を除いて)使用する必要があります。

8
Harold Fischer

long timeで実行されるスクリプトを実行する必要があり、sshセッションにいるときは、次のいずれかが必要です。

  1. ネットワークが切断されたとき、またはラップトップを梱包して離れたときでも、タスクは続行されます。

    a。タスクは私からのインタラクティブな入力なしで終了できます。

     Nohup do_my_stuff &
    

    b。このタスクには、標準入力で私からの何かが必要になる場合があります。

     man tmux
     history -w
     tmux
     do_my_stuff
    
  2. バックグラウンドプロセスは私の現在のセッションを何らかの形で強化しており、セッションと共に終了するはずです。珍しい。

     enhance_my_session  >>/tmp/enhance.$$.log 2>&1 &
    
  3. 私のsshセッションでいくつかのログをランダムに吐き出してほしい。待って、何?いいえ、私はそれを望みません。ありがとうdisown

  4. もう1つ必要なことは、プロセスを完全に切り離されたデーモンに変換することですが、次回の起動時に自動的に開始しないようにします。システムがいつ再起動するか、誰が再起動するかは予測できないので、私はそれを望みません。

10
kubanczyk

通常、私は次のようにします。

  1. myprog &現在のログインシェルからバックグラウンドで何かを実行したいだけの場合。これは私にとって99%の時間で十分です...

  2. Nohup myprog > /my/path/output.txt &シェルから何かを開始したが、後でログアウトしたい場合(おそらくバックグラウンドタスクがまだ実行中の場合)。

1
FoggyDay

シェルの終了とターミナルの中止を区別する必要があります。

  1. シェルは、中止シグナルを受け取ると、既知のすべてのジョブ(子は除く)を強制終了します。
  2. 端末は、それが制御端末であったすべてのものを強制終了します。

一般に、(ユーザーレベルでの)最良の解決策はscreenです。

タスクがユーザー関連ではなくシステム関連である場合は、代わりに手動で開始するsystemdサービスにすることができます。

0
Hauke Laging