私は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/...
0
1
2
/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
ている場合は、プロセスをアタッチしてstdin
fifo にリダイレクトするなどのデバッガーを使用する必要があります。
gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)
そして、以下のようなことをして、入力をサーバーに送信します(必要に応じて別のターミナルウィンドウで)。
echo "command" > /tmp/srv-input
EOFをサーバーに送信するには、cat > /tmp/srv-input
PIDがに保存されているプロセスを強制終了する必要があります/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 * `