次のように、端末からプロセスを切り離しました。
$ process &
その端末は長い間閉じられていますprocess
が、まだ実行されています。そのプロセスの標準入力にいくつかのコマンドを送信したいと思います。それは可能ですか?
次のように、端末からプロセスを切り離しました。
$ process &
その端末は長い間閉じられていますprocess
が、まだ実行されています。そのプロセスの標準入力にいくつかのコマンドを送信したいと思います。それは可能ですか?
回答:
はい、そうです。まず、パイプを作成します
mkfifo /tmp/fifo
。gdbを使用してプロセスにアタッチします。
gdb -p PID
次に、stdinを閉じcall close (0)
ます。もう一度開きます:call open ("/tmp/fifo", 0600)
最後に、(gdbがハングする可能性があるため、別の端末から)書き留めます。
echo blah > /tmp/fifo
touch /tmp/thefile
です。パイプではなくファイルを作成します。標準出力は1なのでcall close (1)
、また、書き込みに適切なアクセス許可を使用しますcall open ("/tmp/thefile", 0400)
。echo…
もちろん、必要とされていません。
call open("/tmp/fifo", 0600)
。どんな助けでも大歓迎
元の端末にアクセスできなくなった場合...
reptyr
あなたが望むものかもしれません、https://serverfault.com/a/284795/187998を参照してください
そこから引用:
まさにそれを行うreptyrを 見てください。githubページにはすべての情報があります。reptyr-プログラムを「再試行」するためのツール。
reptyrは、既存の実行中のプログラムを取得して新しい端末に接続するためのユーティリティです。ssh経由で長時間実行されるプロセスを開始しましたが、終了する必要があり、中断したくないですか?画面を起動し、reptyrを使用してそれを取得し、sshセッションを終了して家に向かいます。
使用法
レプティルPID
「reptyr PID」は、ID PIDのプロセスを取得し、現在の端末に接続します。
接続後、プロセスは^ Cや^ Zを含む新しいターミナルから入力を受け取り、新しいターミナルに出力を書き込みます。(残念ながら、バックグラウンドで実行する場合は、古い端末で「bg」または「fg」を実行する必要があります。これは、シェルにパッチを当てずに適切な方法で修正することは不可能です。)
できないと確信しています。
を使用して確認し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
)に到達できません。
echo "test" > /dev/pts/1
プロセスへの入力を送信しません9947
-それは、そのプロセスの端末に出力単語「テスト」します。
編集:ステファン・ギメネスが言ったように、それはそれほど単純ではありません。別の端末に印刷することしかできません。
/ procを使用して、このプロセスへの書き込みを試みることができます。/ proc / pid / fd / 0に配置する必要があります。
echo "hello" > /proc/PID/fd/0
それを行う必要があります。試したことはありませんが、このプロセスに有効なstdinファイル記述子が残っている限り、動作するはずです。あなたはそれをして確認することができますls -l
には/ proc / PID / FD /。
プロセスを実行し続ける方法の詳細については、nohupを参照してください。
echo
、端末デバイスに何かを入力すると、端末に書いたものが印刷されるだけで、プロセスには送信されません。
でコマンドラインを&
終了するだけでは、プロセスは完全には切り離されず、バックグラウンドで実行されます。(zsh
使用&!
すると、実際に切り離すことができますdisown
。それ以外の場合は後で行うことができます)。
プロセスがバックグラウンドで実行されると、制御端末からの入力を受信しなくなります。しかし、あなたはそれをフォアグラウンドに送り返すことができfg
、それから再び入力を読み込みます。
そうでない場合、デバッグツールを使用しない限り、ファイル記述子(stdinを含む)を外部で変更したり、失われた制御端末を再接続したりすることはできません(Ansgarの回答を参照するか、retty
コマンドを参照してください)。
>>/dev/stderr
..私は、端末を閉じたときにそうでない場合は、「否認」のプロセスがあまりにも終了します..私は本当にこのカントーを理解していなかったが