分離したプロセスに端末を接続するには?

分離したプロセスに端末を接続するには?

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

$ process &

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

答え1

はい。まずパイプを作成します mkfifo /tmp/fifo。 gdbを使用してプロセスに接続します。 gdb -p PID

その後、stdinを閉じてcall close (0)再度開きます。call open ("/tmp/fifo", 0600)

最後に、以下を作成します(gdbが中断される可能性があるため、他の端末で)。

echo blah > /tmp/fifo

答え2

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

reptyrあなたが望むものかもしれません。一度見てくださいhttps://serverfault.com/a/284795/187998

そこから引用するには:

見るレプテル、まさにその仕事をします。 githubページにはすべての情報があります。

Reptyr - プログラムを「再コンパイル」するツールです。

reptyrは、既存の実行中のプログラムをインポートして新しい端末に接続するユーティリティです。 SSHを介して長期実行プロセスを開始しましたが、終了する必要があり、それを中断したくありませんか?画面を起動し、reptyrでキャッチしてSSHセッションを終了し、家に戻ります。

使用法

レプテルPID

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

一度接続すると、プロセスは新しい端末から入力を受け取り、^Cと^Zを含む新しい端末に出力を書き込みます。 (残念ながら、バックグラウンドに設定すると、以前の端末でまだ「bg」または「fg」を実行する必要があります。これは、シェルにパッチを適用しないと合理的な方法で修正されない可能性があります。)

編集者は、「reptyr子プロセスのあるプロセスをインポートできません。または、子プロセス(reptyrバージョン0.6.2)は限定的にサポートされています」と主張します。質問質問

答え3

私はあなたができないと確信しています。

使用法を確認してくださいps x。プロセスに?asがある場合制御端子、これ以上入力を送信できません。

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/19942他のプロセスにアクセスできません()。

次に使用できます画面またはマルチプレクサこの状況を避けるために。

答え4

編集する:Stephane Gimenezが言ったように、それほど単純ではありません。他の端末にのみ印刷できます。

以下を使用してこのプロセスに書き込むことができます。/プロセス。配置する必要があります/プロセス/PID/fd/0、とても簡単です。

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

それは行わなければなりません。試したことはありませんが、プロセスが機能し続ける限り動作します。標準入力ファイル記述子。ls -lで確認できます/プロセス/PID/fd/

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

バラより北面プロセスを実行し続ける方法の詳細。

関連情報