実行中のプロセスを後からscreenに移動させる方法

実行中のプロセスを後からscreenに移動させる方法について紹介します.

reptyrパッケージが必要になりますのであらかじめインストールしておいてください.

$ sudo apt install reptyr

次に,何かしら時間がかかりそうなプロセスを走らせておきましょう.

$ <時間がかかるコマンド>

これで準備完了です.

では,screenに移動させてみましょう.

1 . Ctrl+Zでプロセスを一時停止

[1]+  Stopped <時間がかかるコマンド>

2 . jobsコマンドで該当プロセスのPIDを見つけてメモします.

$ jobs -l
[1]+ 7597 <時間がかかるコマンド>

3 . ptrace_scopeのモードの変更

Ubuntuでは他のプログラムにプロセスを奪わることを避けるためにptrace_scopeによりプロセスが操作できないようになっています.

https://www.kernel.org/doc/Documentation/security/Yama.txt

今回,プロセスを別のプロセスに移動させる操作をしたいので,

そのモードを変更する必要があります.

そのためには以下のコマンドを実行します.

$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0

4 . screenを実行

5 . screen上でreptyrを用いてプロセスの親を切り替え

$ reptyr 7597

ちなみに,screenに移行したいプロセスが子プロセスを走らせていたりするときは,Tオプションを追加します.

このTオプションはターゲットの端末セッション全体を移動させるものです.

$ reptyr -T 7597

6 . fgコマンドで停止しているプロセスをフォアグラウンドで実行

$ fg
... プロセスの出力 ...

7 . ptraceによるロックを有効化

$ echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope
1

参考

https://datawookie.netlify.app/blog/2017/12/moving-a-running-process-to-screen/