私はUbuntu 10.04ボックスを使用していて、ssh経由でバックグラウンドでサーバー(myserver&)を起動しました。サーバーは正常に動作していますが、サーバーを制御する唯一の方法はこのメソッドを使用するため、サーバーの標準入力を取得する方法が必要です。
既に実行中のプロセスの標準入力を取得する方法はありますか?明らかに、今これを行うつもりなら、stdinにリダイレクトするFIFOで開始しますが、残念ながら今のところ少し遅れています。
何か案は?
私はUbuntu 10.04ボックスを使用していて、ssh経由でバックグラウンドでサーバー(myserver&)を起動しました。サーバーは正常に動作していますが、サーバーを制御する唯一の方法はこのメソッドを使用するため、サーバーの標準入力を取得する方法が必要です。
既に実行中のプロセスの標準入力を取得する方法はありますか?明らかに、今これを行うつもりなら、stdinにリダイレクトするFIFOで開始しますが、残念ながら今のところ少し遅れています。
何か案は?
回答:
/ proc pidディレクトリへの書き込みを試すことができます。デーモンのpidが2000である場合、/ proc / 2000 / fd / 0への書き込みを試してください
0を使用してコマンドを開始します。コマンドは、読み込み FDからと書き込み FDにして(例えば、あなたのターミナルエミュレータとのSSHまたは直接以上)の仮想端末と通信します。他のプロセスは、(例えば通じ、そのファイルにアクセスする場合、)まったく同じことが起こる、すなわち書き込み、それには、端末にではなく、コマンドに書き込みます。2/dev/pty/...012/proc
入力として名前付きパイプ(fifo)を使用してサーバーを起動できます。
mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &
cat > /tmp/srv-input &EOFを受信するようにサーバーを避けることが重要です。サーバーがEOFを受信しないように、少なくとも1つのプロセスでfifoを書面で開く必要があります。このコマンドのPIDは/tmp/srv-input-cat-pid、後のキルのためにファイルに保存されます。
サーバーをすでに起動しgdbている場合は、プロセスをアタッチしてstdinfifo にリダイレクトするなどのデバッガーを使用する必要があります。
gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)
そして、以下のようなことをして、入力をサーバーに送信します(必要に応じて別のターミナルウィンドウで)。
echo "command" > /tmp/srv-input
EOFをサーバーに送信するには、cat > /tmp/srv-inputPIDがに保存されているプロセスを強制終了する必要があります/tmp/srv-input-cat-pid file。
GDBの場合、GDBを終了するとEOFが送信されます。
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &?これにより、パイプも開いたままになります
tail動作しませんが、これを追加してジョブを終了します:cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `