私はUbuntu 10.04を使用しており、サーバーをバックグラウンド(myserver&)でssh経由で起動しました。サーバーは正常に動作していますが、サーバーを制御する唯一の方法はこのメソッドを使用するため、サーバーの標準入力を取得する方法が必要です。
すでに実行中のプロセスのstdinにアクセスして、それに書き込むことができる(そしてうまくいけばそのstdoutを読み取る)ための方法はありますか?明らかに、これを今から行う場合は、FIFO stdinにリダイレクトすることから始めますが、残念ながら今は少し遅れています。
何か案は?
/ proc pidディレクトリに書き込んでみてください。デーモンのpidが2000であるとしたら、/ proc/2000/fd/0に書き込んでみてください
名前付きパイプ(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は、後のkillのために/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=をサーバーに送信するには、PIDがcat > /tmp/srv-input
に保存されている/tmp/srv-input-cat-pid file
プロセスを強制終了する必要があります。
GDBの場合、GDBを終了するだけで、EOFが送信されます。
上記と同じですが、「猫」は機能しませんでした。ファイルはEOFを取得し、1つのコマンドを送信した後に終了しました。
これは私のために働きました:
#!/bin/bash
mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &