Bashを使用しているデスクトップでプロセスを起動して完全に独立して実行するには、「&」、nohup、disown、または3つの組み合わせを使用する必要がありますか?

Bashを使用しているデスクトップでプロセスを起動して完全に独立して実行するには、「&」、nohup、disown、または3つの組み合わせを使用する必要がありますか?

ローカルでもSSHでもXubuntu 16.04でこれら4つのコマンドを実行すると、すべて同じことをするようです。

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が「拒否」されるため、geditとgeditの違いを理解できません。

2番目と3番目の場合、私が見た唯一の違いは、コマンド出力が別々のファイルに書き込まれ、bgプロセスを作成した元のシェルセッションが終了した場合でも、その別のログに記録され続けることです。

3つと4つのケースでは、技術的な違いがあるという記事を常に読んでいましたが、なぜ2つのうちの1つを好むのかは全くわかりません。

どちらを使うべきですか?チュートリアルとQ&Aで使用されている4つのコマンドの両方を見て、nohupとdisownの技術的違いを説明する非常に良い答えがありますが、明確な推奨事項を得ることはできないようです(ロギング目的やシェル互換性以外)。

答え1

しばらく実行するスクリプトを実行する必要があるとき長期、会議中ですssh。欲しいものは次のとおりです。

  1. ネットワークがダウンしたりノートパソコンを取り出したりしても、作業は続行する必要があります。

    ㅏ。これは私の対話型入力なしで完了することができます。

     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. 私が望んでいないもう一つのことは、プロセスを完全に分離されたデーモンに変換しますが、次回の起動時に自動的に起動しないことです。システムがいつ再起動するのか、誰が再起動するのかを予測できないため、これは決して望ましくありません。

答え2

通常、私は次のことを行います。

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

  2. nohup myprog > /my/path/output.txt &シェルで何かを開始したが後でログアウトしたい場合(バックグラウンドジョブが実行中の間)

答え3

シェルの終了と端末の中断を区別する必要があります。

  1. シェルがハング信号を受信すると、既知のすべてのタスクを終了します(サブタスクを除く)。
  2. ターミナルはコントロールターミナルとして何でも殺します。

一般に、ユーザーレベルで最高のソリューションはIMHOですscreen

ジョブがユーザー固有ではなくシステム関連の場合は、手動で開始するのではなく、システムサービスにすることができます。

関連情報