解決策 1:
入力として名前付きパイプ (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
を kill する必要があります /tmp/srv-input-cat-pid file
に保存されている PID の処理 .
GDB の場合、GDB を終了するだけで EOF が送信されます。
解決策 2:
/proc pid ディレクトリに書き込んでみてください。デーモンの pid が 2000 だとします。/proc/2000/fd/0 に書き込んでみてください
解決策 3:
上記と同じですが、「cat」は機能しませんでした。ファイルは EOF を取得し、1 つのコマンドを送信した後に終了しました。
これは私のために働いた:
#!/bin/bash
mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &