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


159

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

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

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


8
既に開始されているプロセスをnohup / screenすることもできますか?そして、ドロップされたSSHセッションで実行されているコマンドを再開しない(現在は)ここに述べたいくつかのptraceベースのソリューションに言及し、。
ジル

unix.stackexchange.com/a/4039/13496のような質問から、私はrettyneercsについて聞いています。うーん...「のようななめらかあります不思議場合は、画面私は、プロセスの次の時間を実行する前に、ここで」層が、私はそれが簡単に標準入力/アウト/ errに戻ってスナップするようになりますこと、将来のトップ端末を失う必要があります
マルコス・

私が推測できないこの質問の二次的/暗黙的な問題は...なぜ新しい/ちょうど起動されたものがバックグラウンドで標準入力を必要としない/待つことがないときにシェルが中断されたジョブを否認することを選んだのですか?これは私が慣れてきた治療法なので、ここで何が変わったのかわからない
マルコス

回答:


86

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

ときに最初にログイン実行中の画面を起動します-私は実行しscreen -D -Rてコマンドを実行すると、どちらかとそれを切断したり、一時停止CTRL-Zを押して、画面から切断当時とCTRL-Aその後D

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


2
うわー、GNU Screenの答えが現在最も低い評価だとは信じられません。何か不足していますか?
ファヒムミタ

1
おそらく!私には最高のようだ。
アンドリューヨクム

1
振り返ってみると、それが最も苦痛のないソリューションであるように見えますが、それに応じて計画し、画面環境内からプロセスを起動することができます。とにかく、私はそれを公式の答えにしました!
レベスク

28
これは質問に答えないと思います。質問は「プログラムを実行しています」で始まります。この答えは...それはまだ動作していないと仮定し
あんこ

はい、彼はそれをスクリーンセッションに入れたいと明確に書いた:-)
Florian Heigl

112

disown組み込みのシェルからプログラムの「所有権」を取り消すことができます。

# press Ctrl+Z to suspend the program
bg
disown

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


(つまり、使用してデバッガでプログラムを添付して、別のファイルへのファイルディスクリプタを再接続することが可能であるptrace)、それは呼んで作るopendupclose。これを行うツールがいくつかあります。これは扱いにくいプロセスであり、代わりにプロセスをクラッシュさせることもあります。可能性は次のとおりです(実行中のプロセスを否認し、それを新しいスクリーンシェルに関連付けるにはどうすればよいですか?および既に開始されたプロセスをnohup / screenできますか?


disownジョブ制御リストからプロセスを削除します。
ctrl-alt-delor


@CeesTimmermanこれは、シェルのジョブテーブルにジョブを残しますが、その利点は何ですか?
ジル

@Gilles:それで、あなたはまだfgまたはkillそれをすることができ、それがそれ自身で終わるかどうかを見る。
ピーターコーデス

ユーティリティがプロセスのグループ(例bzcat a.bz2 | grep text)で動作すると述べたものは何ですか?Man for reptyrは、プロセスを子と一緒に移動することをサポートしていないと言います。
dma_k

64

端末間でプロセスを移動したり、否認された人を再接続するには、たとえば、reptyrを使用できます。


1
助かりました、ありがとう!著者のウェブサイトを読んで、似たようなツールや古いツールよりもうまく機能することを確認します。ncursesプログラム用。
マルコス

4
これは素晴らしいです。sshでまっすぐに実行してから電車に乗る必要があるため、常に仕事を失うという友人の苦境を解決するはずです。 「おっと、スクリーンを使うのを忘れました。もう一度。」
アダム・カッツ

3
+1受け入れられたscreen答えはもちろん理想的ですが、実際に質問に答えるわけではありません。具体的には、現在実行中のプロセスを移動する方法などを要求しますscreen。:また、この答えを参照serverfault.com/a/284795
toxefa

1
絶対ライブセーバー。ユーザーの確認を待っているapt dist-upgradeの実行に再接続できました。
andig

28

私のお気に入りのソリューションはを使用tmuxすることです。セッションをデタッチし、別のターミナルで再アタッチできます。

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


1
友人とセッションを共有し、複数のウィンドウやペインなどを使用することもできます!愛しています^ _ ^
イゴール


21

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


19

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


2
面白い。ダーティ(ptrace)を再生しますが、ファイル記述子を操作するだけでなく、プロセスをフォークします。つかむことができますfind /が、インタラクティブなbashをクラッシュさせました。
ジル

@Gilles私が試したとき、どのように進んだか覚えていないが、評判が良くない、かなり定期的に失敗すると言われている
Michael Mrozek

9

一時停止して後で再起動する場合は、killwith STOPまたはCONTsignalを使用できます。

最初にプロセスPIDを見つけます

$ ps aux

次に、プロセスにリストされたそのPIDにシグナルを送信します

$ kill -STOP <PID>

$ kill -CONT <PID>

9

ThomasHabetsの「injcode」はまさに私が必要とするもののようです:

https://github.com/ThomasHabets/injcode

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

READMEから:

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

画面に移動するかもしれません。

最初に1つのターミナルでirssiを起動します。

別のターミナルでinjcodeを実行します:$ injcode -m retty

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


1

これは私のために働いた:

  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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.