web-dev-qa-db-ja.com

バックグラウンドプロセスのstdinへの書き込み

私はUbuntu 10.04を使用しており、サーバーをバックグラウンド(myserver&)でssh経由で起動しました。サーバーは正常に動作していますが、サーバーを制御する唯一の方法はこのメソッドを使用するため、サーバーの標準入力を取得する方法が必要です。

すでに実行中のプロセスのstdinにアクセスして、それに書き込むことができる(そしてうまくいけばそのstdoutを読み取る)ための方法はありますか?明らかに、これを今から行う場合は、FIFO stdinにリダイレクトすることから始めますが、残念ながら今は少し遅れています。

何か案は?

27
tajmorton

/ proc pidディレクトリに書き込んでみてください。デーモンのpidが2000であるとしたら、/ proc/2000/fd/0に書き込んでみてください

10
katriel

名前付きパイプ(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が送信されます。

29
jfg956

上記と同じですが、「猫」は機能しませんでした。ファイルはEOFを取得し、1つのコマンドを送信した後に終了しました。

これは私のために働きました:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
4
Tamir