次のように端末からプロセスを分離しました。
$ 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
答え4
編集する:Stephane Gimenezが言ったように、それほど単純ではありません。他の端末にのみ印刷できます。
以下を使用してこのプロセスに書き込むことができます。/プロセス。配置する必要があります/プロセス/PID/fd/0、とても簡単です。
echo "hello" > /proc/PID/fd/0
それは行わなければなりません。試したことはありませんが、プロセスが機能し続ける限り動作します。標準入力ファイル記述子。ls -l
で確認できます/プロセス/PID/fd/。
- /dev/nullへのリンクの場合は=>閉じています。
- /dev/pts/Xへのリンクまたはソケットの場合は=>開いています。
バラより北面プロセスを実行し続ける方法の詳細。