web-dev-qa-db-ja.com

実行中のプロセスを否認し、それを新しい画面シェルに関連付けるにはどうすればよいですか?

SSHシェルで実行中のプログラムがあります。一時停止して、戻ってきたときに実行を一時停止解除できるようにしたい。

私がそうすることを考えた方法の1つは、その所有権をスクリーンシェルに移して、そこで実行し続けることでした。

続行する別の方法はありますか?

164
levesque

GNU screenを使用するのが最善の策です。

最初にログインしたときに画面実行を開始します-screen -D -Rを実行してコマンドを実行し、CTRL-Zで切断または一時停止し、次にCTRL-Aを押して画面から切断します。次にD

マシンに再度ログインしたら、screen -D -Rを実行して再接続します。以前と同じシェルになります。 jobsを実行すると、中断されたプロセスが表示され、中断されたプロセスを確認できます。また、%1(またはそれぞれのジョブ#)を実行すると、再びフォアグラウンドになります。

88
Andrew Yochum

disown ビルトインを使用して、シェルからプログラムの「所有権」を取り消すことができます。

# press Ctrl+Z to suspend the program
bg
disown

ただし、これは、シェルの終了時にSIGHUP信号をプログラムに送信しないようにシェルに指示するだけです。プログラムは、通常、標準入力、出力、およびエラーストリームとして、ターミナルとの接続を保持します。それらを別の端末に再接続する方法はありません。 ( Screen は各ウィンドウの端末をエミュレートすることで機能するため、プログラムは画面ウィンドウにアタッチされます。)


デバッガーでプログラムをアタッチし(つまり ptrace を使用)、opendupおよびclose。これを行うツールがいくつかあります。これはトリッキーなプロセスであり、プロセスをクラッシュさせることがあります。可能性には、(-への回答から収集されたリンク 実行中のプロセスを否認して新しいスクリーンシェルに関連付けるにはどうすればよいですか? および 既に開始されているプロセスをNohup /スクリーニングできますか? =):

端末間でプロセスを移動したり、不名誉者を再接続したりするには、たとえば、 reptyr

67
jofel

私のお気に入りの解決策はtmuxを使用することです。セッションを切り離し、別の端末に再接続することができます。

前のセッションから切り離すと、ターミナルを安全に閉じることができます。後でtmux attachログアウトした場合でも、セッションに戻ります。

28
daisy

実行中のプログラムを別の端末に再接続できるようにする retty と呼ばれる小さなユーティリティもあります。

21
adamg

私は定期的には使用していませんが、 neercs はこれをサポートしていると主張しています。これはscreenのようなプログラムであり、ペイン管理の改善などのさまざまな機能を備えていますが、主な機能は、プロセスをペインにインポートする機能です。

19
Michael Mrozek

一時停止して後で再起動したい場合は、killSTOPまたはCONT信号と一緒に使用できます。

まず、PIDプロセスを見つけます

$ ps aux

次に、プロセスにリストされているそのPIDに信号を送信します。

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

ThomasHabetsの「injcode」は、まさに私が必要としているもののようです。

https://github.com/ThomasHabets/injcode

Injcodeプログラムを使用すると、事前に知っていて画面またはtmuxを実行していたかどうかに関係なく、実行中のプロセスに任意のコードを挿入できます。

READMEから:

例1:irssiをある端末から別の端末に移動する

多分それを画面に移動します。

まず、1つのターミナルでirssiを起動します。

別の端末でinjcodeを実行します。$ injcode -m retty

Irssiは、新しい制御端末を含む2番目の端末に移動する必要があります。

9
user2688272

これは私のために働きました:

  1. bgプロセス
  2. jobs -lプロセス番号を見つける
  3. tmuxシェルウィンドウマネージャーを起動
  4. 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
1
kqw