web-dev-qa-db-ja.com

既に実行中のプロセスをScreenに移動する

私のオフィスの仕事では、VNCを介してLinuxボックスに接続しているのを日常的に見ています。

ときどきコンソールでリモートジョブを開始し、後でそれが予想よりもはるかに長く実行されていることに気付きます。 (そもそもスクリーンの下でそれを始めたはずです...)

VNCセッションを開いたままにするためだけに、ワークステーションを一晩稼働させておきたくありません。すでに実行中のリモートジョブをScreenセッション(リモートボックス上)に移動したいので、ワークステーションの電源を切ります(そして翌朝再接続します)。

これを行うにはどうすればよいですか?

232
DevSolar

まさにそれを行う reptyr を見てください。 githubページにはすべての情報があります。

reptyr-プログラムを「再結合」するためのツール。

reptyrは、既存の実行中のプログラムを取得して新しい端末に接続するためのユーティリティです。 sshを介して実行時間の長いプロセスを開始しましたが、終了する必要があり、中断したくないですか?画面を開始し、reptyrを使用してそれを取得し、sshセッションを終了して家に向かいます。

使用法

reptyr PID

「reptyr PID」は、ID PIDのプロセスを取得し、現在の端末にアタッチします。

接続後、プロセスは^ Cおよび^ Zを含む、新しいターミナルからの入力を受け取り、新しいターミナルに出力を書き込みます。 (残念ながら、バックグラウンドで使用している場合でも、古いターミナルで「bg」または「fg」を実行する必要があります。これは、シェルにパッチを適用せずに適切な方法で修正することはおそらく不可能です。)

229
DaveJohnston

簡単にはできません。コンソールを開いた後、最初に画面を開始することを習慣にすることをお勧めします。

ただし、実際の問題については、もう1つ試すことができます。ターミナルからジョブを起動した後、ctrl-zを入力してからbgを入力して、ジョブをバックグラウンドで実行します。その後、ジョブをその親シェルから切り離します。バッシュではあなたがやるdisown -h %<jobid>。その後、安全にターミナルを閉じることができ、ジョブは実行を継続します。

46
earl

Linuxを使用している場合、新しく起動された画面プロセス内でrettyを使用するのはどうですか?

$ screen -S my_process
$ retty $(pgrep my_process)
/redraw

HTH

乾杯、

39
Rob Wells