GNU/Linux >> Linux の 問題 >  >> Linux

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

解決策 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 &

Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  1. CentOS / RHEL 5,6 で /tmp および /var/tmp ディレクトリ内のファイルの自動削除を無効にする方法

  2. http://127.0.0.1:8000 でリッスンしている symfony プロセスを停止するにはどうすればよいですか?

  3. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  1. echo または print /dev/stdin /dev/stdout /dev/stderr

  2. デフォルトの /tmp を /home/user/tmp に変更する方法

  3. /tmp と /var/tmp の違いと正しい使い方