SSHシェルで実行中のプログラムがあります。一時停止して、戻ってきたときに実行を一時停止解除できるようにしたい。
私がそうすることを考えた方法の1つは、その所有権をスクリーンシェルに移して、そこで実行し続けることでした。
続行する別の方法はありますか?
GNU screen
を使用するのが最善の策です。
最初にログインしたときに画面実行を開始します-screen -D -R
を実行してコマンドを実行し、CTRL-Z
で切断または一時停止し、次にCTRL-A
を押して画面から切断します。次にD
。
マシンに再度ログインしたら、screen -D -R
を実行して再接続します。以前と同じシェルになります。 jobs
を実行すると、中断されたプロセスが表示され、中断されたプロセスを確認できます。また、%1
(またはそれぞれのジョブ#)を実行すると、再びフォアグラウンドになります。
disown
ビルトインを使用して、シェルからプログラムの「所有権」を取り消すことができます。
# press Ctrl+Z to suspend the program
bg
disown
ただし、これは、シェルの終了時にSIGHUP
信号をプログラムに送信しないようにシェルに指示するだけです。プログラムは、通常、標準入力、出力、およびエラーストリームとして、ターミナルとの接続を保持します。それらを別の端末に再接続する方法はありません。 ( Screen は各ウィンドウの端末をエミュレートすることで機能するため、プログラムは画面ウィンドウにアタッチされます。)
デバッガーでプログラムをアタッチし(つまり ptrace
を使用)、open
、dup
およびclose
。これを行うツールがいくつかあります。これはトリッキーなプロセスであり、プロセスをクラッシュさせることがあります。可能性には、(-への回答から収集されたリンク 実行中のプロセスを否認して新しいスクリーンシェルに関連付けるにはどうすればよいですか? および 既に開始されているプロセスをNohup /スクリーニングできますか? =):
端末間でプロセスを移動したり、不名誉者を再接続したりするには、たとえば、 reptyr 。
私のお気に入りの解決策はtmux
を使用することです。セッションを切り離し、別の端末に再接続することができます。
前のセッションから切り離すと、ターミナルを安全に閉じることができます。後でtmux attach
ログアウトした場合でも、セッションに戻ります。
実行中のプログラムを別の端末に再接続できるようにする retty と呼ばれる小さなユーティリティもあります。
私は定期的には使用していませんが、 neercs はこれをサポートしていると主張しています。これはscreen
のようなプログラムであり、ペイン管理の改善などのさまざまな機能を備えていますが、主な機能は、プロセスをペインにインポートする機能です。
一時停止して後で再起動したい場合は、kill
をSTOP
またはCONT
信号と一緒に使用できます。
まず、PIDプロセスを見つけます
$ ps aux
次に、プロセスにリストされているそのPIDに信号を送信します。
$ kill -STOP <PID>
$ kill -CONT <PID>
ThomasHabetsの「injcode」は、まさに私が必要としているもののようです。
https://github.com/ThomasHabets/injcode
Injcodeプログラムを使用すると、事前に知っていて画面またはtmuxを実行していたかどうかに関係なく、実行中のプロセスに任意のコードを挿入できます。
READMEから:
例1:irssiをある端末から別の端末に移動する
多分それを画面に移動します。
まず、1つのターミナルでirssiを起動します。
別の端末でinjcodeを実行します。$ injcode -m retty
Irssiは、新しい制御端末を含む2番目の端末に移動する必要があります。
これは私のために働きました:
bg
プロセスjobs -l
プロセス番号を見つけるtmux
シェルウィンドウマネージャーを起動reptyr -L PROCESSNUMBER
reptyr
の-L
これを機能させるために必要でした:
-L Like '-l', but also redirect the child's stdio to the slave.
このエラーのため:
$ reptyr 30622
[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied
そして-L
$ reptyr -L 30622
Opened a new pty: /dev/pts/4