web-dev-qa-db-ja.com

Bashプロセス-再接続プロセスがバックグラウンドで開始されました

&で端末から開始されたプロセスを特定の端末に再接続する方法はありますか?たとえば、私はケイトを次のように始めました:

kate &

そして今、私は与えられたターミナルにプロセスを再アタッチしたいと思います。

8
Mauren

ここには2つの問題があります。

1)HUPによる死亡とその回避:

シェルでプログラムを開始してからそのシェルを終了すると、すべての子プロセスが強制終了されます。これには、バックグラウンドで実行されているプログラムが含まれます。 (例のkate &のように、コマンドの最後に&で始まるものだけでなく、中断したプロセスも controlz そしてbg)。

シェルを閉じると、どちらも死亡します。* 1

これを回避するには、バックグラウンドプログラムをdisowningします。その後は実行を継続しますが、シェルのフォアグラウンドに戻すことはできません。

Nohup(Nohup kate &など)を使用して、プログラムからの出力をファイルに保存できます。ただし、シェルに完全に再接続することもできなくなりました。


2)端末エミュレータ。

端末をエミュレートするプログラムを起動することもできます。このプログラムは、端末に再接続できるように特別に構築されています。 screentmuxは、この2つの例です。

画面の使用例:

  • ホストにログインまたはsshします。
  • screen(開始画面。デフォルトでは、これにより新しいシェルが開始されます)。
  • kate(ケイトを開始)。
  • ControlAD (画面を切り離すと、最初にログインしたときと同じプロンプトに戻ります。).
  • logout

別のコンピュータまで歩くか、数時間後に戻ってきます。 (または両方:))-ホストにログインまたはsshします。 -screen -r(画面に再接続します。ケイトを実行しているシェルに戻ります。

画面に役立つコマンド:

画面-d
画面プログラムの外部から画面を切り離します。
使用制御AD 画面の内側から外します。

screen -r画面に再接続します(たとえば、別の場所から)

screen -dr
接続されている画面がある場合は、まずそれを切り離します。次に、ローカルに接続します。
便利なのは、オフィスでそれを切り離し、自宅からログインするのを忘れた;)

画面-x
他のセッションを閉じずに、実行中の画面にアタッチします。共有デバッグ、ヘルプセッションなどに役立ちます。


* 1:編集:これに答えたとき、私はすべてのシェルが常にすべての子にsigHUPを送信すると想定しました。ただし、これはオプションであり、シェルによっては構成可能である場合があります。場合によっては、それはもはやデフォルトではありません。

例1:bashでは、組み込みコマンド shopt を使用してこのオプションを構成できます。 (shopt -s huponexit)。

例2:zshで setoptHUPが必要です。

8
Hennes

fg は、現在のターミナルの背景から前景に何かをもたらします。

12
SlightlyCuban