SSHシェルで実行中のプログラムがあります。私はそれを一時停止し、戻ってきたときに実行を一時停止解除できるようにします。
私がそうすることを考えた1つの方法は、所有権をスクリーンシェルに移し、そこでスクリーンシェルを実行し続けることでした。
続行する別の方法はありますか?
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
はシェルが終了したときにプログラムにシグナルを送信しないようにシェルに指示するだけです。プログラムは、通常、標準入力、出力、およびエラーストリームとして、端末との接続を保持します。それらを別の端末に再接続する方法はありません。(画面は各ウィンドウのターミナルをエミュレートすることで機能するため、プログラムは画面ウィンドウに接続されます。)
(つまり、使用してデバッガでプログラムを添付して、別のファイルへのファイルディスクリプタを再接続することが可能であるptrace
)、それは呼んで作るopen
、dup
とclose
。これを行うツールがいくつかあります。これは扱いにくいプロセスであり、代わりにプロセスをクラッシュさせることもあります。可能性は次のとおりです(実行中のプロセスを否認し、それを新しいスクリーンシェルに関連付けるにはどうすればよいですか?および既に開始されたプロセスをnohup / screenできますか?)
disown
ジョブ制御リストからプロセスを削除します。
fg
またはkill
それをすることができ、それがそれ自身で終わるかどうかを見る。
bzcat a.bz2 | grep text
)で動作すると述べたものは何ですか?Man for reptyr
は、プロセスを子と一緒に移動することをサポートしていないと言います。
screen
答えはもちろん理想的ですが、実際に質問に答えるわけではありません。具体的には、現在実行中のプロセスを移動する方法などを要求しますscreen
。:また、この答えを参照serverfault.com/a/284795
私のお気に入りのソリューションはを使用tmux
することです。セッションをデタッチし、別のターミナルで再アタッチできます。
前のセッションからデタッチすると、ターミナルを安全に閉じることができます。後でtmux attach
ログアウトした場合でも、セッションに戻るために使用します。
私は定期的に使用していませんが、neercsはこれをサポートしていると主張しています。これは、screen
ペイン管理の改善など、さまざまな派手な機能を備えたプログラムに似ていますが、主な機能は、プロセスをペインにインポートする機能です
ptrace
)を再生しますが、ファイル記述子を操作するだけでなく、プロセスをフォークします。つかむことができますfind /
が、インタラクティブなbashをクラッシュさせました。
ThomasHabetsの「injcode」はまさに私が必要とするもののようです:
https://github.com/ThomasHabets/injcode
injcodeプログラムを使用すると、事前に知っていてscreenまたは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