分離されたプロセスに端末を接続するにはどうすればよいですか?


99

次のように、端末からプロセスを切り離しました。

$ process &

その端末は長い間閉じられていますprocessが、まだ実行されています。そのプロセスの標準入力にいくつかのコマンドを送信したいと思います。それは可能ですか?



1
、などを検索しrettyserverfault.com / questionsneercs
Gilles

回答:


112

はい、そうです。まず、パイプを作成します mkfifo /tmp/fifo。gdbを使用してプロセスにアタッチします。 gdb -p PID

次に、stdinを閉じcall close (0)ます。もう一度開きます:call open ("/tmp/fifo", 0600)

最後に、(gdbがハングする可能性があるため、別の端末から)書き留めます。

echo blah > /tmp/fifo


6
非常に印象的!
サミュエルエドウィン区

1
プロセスの標準出力をファイルにリダイレクトするのと似たようなことができますか?
rustyx

@rustyx:テストされていませんが、これは動作するはずtouch /tmp/thefileです。パイプではなくファイルを作成します。標準出力は1なのでcall close (1)、また、書き込みに適切なアクセス許可を使用しますcall open ("/tmp/thefile", 0400)echo…もちろん、必要とされていません。
アンスガーエステルマン14

これは素晴らしい!これを使用して、完全に切り離された特定のプロセスに「y」または「n」応答を送信します。切り離されたプロセスには、別のウィンドウへの標準出力があります。ただし、このトリックを実行すると、エコーするとすぐに「y」または「n」が「受信」されないことがわかります。gdbを終了してデタッチし、すべてのエコーを適宜受信する必要があります。プロセスがfifoから入力を受け取る前にgdbを終了する必要なくこれを実行する方法はありますか?
krb686

残念なことに、それはまだ固まっているようですcall open("/tmp/fifo", 0600)。どんな助けでも大歓迎
アーチャー

27

元の端末にアクセスできなくなった場合...

reptyrあなたが望むものかもしれません、https://serverfault.com/a/284795/187998を参照してください

そこから引用:

まさにそれを行うreptyrを 見てください。githubページにはすべての情報があります。

reptyr-プログラムを「再試行」するためのツール。

reptyrは、既存の実行中のプログラムを取得して新しい端末に接続するためのユーティリティです。ssh経由で長時間実行されるプロセスを開始しましたが、終了する必要があり、中断したくないですか?画面を起動し、reptyrを使用してそれを取得し、sshセッションを終了して家に向かいます。

使用法

レプティルPID

「reptyr PID」は、ID PIDのプロセスを取得し、現在の端末に接続します。

接続後、プロセスは^ Cや^ Zを含む新しいターミナルから入力を受け取り、新しいターミナルに出力を書き込みます。(残念ながら、バックグラウンドで実行する場合は、古い端末で「bg」または「fg」を実行する必要があります。これは、シェルにパッチを当てずに適切な方法で修正することは不可能です。)


12

できないと確信しています。

を使用して確認しps xます。プロセスに?asを制御するttyがある場合、それ以上入力を送信できません。

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

この例では、次の9947ようなことを行うために入力を送信できますecho "test" > /dev/pts/1。他のプロセス(9942)に到達できません。

次回は、この状況を回避するためにscreenまたはtmuxを使用できます。


5
またはdtach全体を必要としない場合screen
マナトワーク

4
標準(POSIX、SUS)には方法がありませんが、多くの(ほとんどの?)システムで、デバッガーが使用するメカニズムを使用すること可能です。アンスガーの答えをご覧ください。ではroot、あなたも、他のユーザーのプロセスにこれを行うことができます。
dmckee

3
こうecho "test" > /dev/pts/1プロセスへの入力を送信しません9947-それは、そのプロセスの端末に出力単語「テスト」します。
psmears 14年

6

編集:ステファン・ギメネスが言ったように、それはそれほど単純ではありません。別の端末に印刷することしかできません。

/ procを使用して、このプロセスへの書き込みを試みることができます。/ proc / pid / fd / 0に配置する必要があります。

echo "hello" > /proc/PID/fd/0

それを行う必要があります。試したことはありませんが、このプロセスに有効なstdinファイル記述子が残っている限り、動作するはずです。あなたはそれをして確認することができますls -lは/ proc / PID / FD /

  • / dev / nullへのリンク=>閉じている
  • / dev / pts / Xへのリンクまたはソケット=>それが開いている場合

プロセスを実行し続ける方法の詳細については、nohupを参照してください。


2
それほど単純ではありません。たとえば、stdinが端末にリンクされている場合echo、端末デバイスに何かを入力すると、端末に書いたものが印刷されるだけで、プロセスには送信されません。
ステファンギメネス

5

でコマンドラインを&終了するだけでは、プロセスは完全には切り離されず、バックグラウンドで実行されます。(zsh使用&!すると、実際に切り離すことができますdisown。それ以外の場合は後で行うことができます)。

プロセスがバックグラウンドで実行されると、制御端末からの入力を受信しなくなります。しかし、あなたはそれをフォアグラウンドに送り返すことができfg、それから再び入力を読み込みます。

そうでない場合、デバッグツールを使用しない限り、ファイル記述子(stdinを含む)を外部で変更したり、失われた制御端末を再接続したりすることはできません(Ansgarの回答を参照するか、rettyコマンドを参照してください)。


そして、関連する質問がここにあります:unix.stackexchange.com/q/17648/9426
ステファン・ヒメネス

@Rogachは「その端末は今や長い間閉鎖されている」と述べた。
-andcoz

1
@andcoz:はい、しかし彼はプログラムがSIGHUPされていないことを幸運に思っています。より安全な方法を提案していました。
ステファンギメネス

ここで、私は最初と同じように標準出力をリダイレクトしている場合のみ、実際に動作する勘当>>/dev/stderr..私は、端末を閉じたときにそうでない場合は、「否認」のプロセスがあまりにも終了します..私は本当にこのカントーを理解していなかったが
アクエリアスパワー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.