パイプから読み取り、ファイルに書き込む
デーモンが任意のプロセスによって生成された入力を読み取るようにするには、そのプロセスをパイプに接続する必要があります。ここで、任意のプロセスとはコマンドをエコーすることであり、それは別のコンテキストで実行されます。名前付きパイプを作成します(UNIXのコンテキストではfifoと呼ばれることが多い)。
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
そしてパイプにコマンドを書くだけです:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
ただし、これがそのまま機能する可能性はほとんどありません。デーモンが標準入力でファイルの終わりを検出すると、デーモンが終了する可能性が高くなります。これは、パイプに書き込む最初のプロセスが終了するとすぐに発生します。このtail -f
問題を回避するために使用できます。
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
一部のtail
実装では、バッファリングによって噛み付かれる可能性があります。tail
プロセスは、出力を送信するのに十分なバイトを確保するまで待機します。これはPOSIXツールボックスでは解決できないと思います。それが問題である場合は、簡単なC、Perl、またはPythonプログラムを使用してください。私が知る限り、tail
(Linuxや他の場所で見られるような)GNU coreutilsはこの点で安全です。
デーモンを停止するecho >/var/run/daemon.fifo
と、tail
プロセスが強制終了されます。
画面内でプログラムを起動する
サービスマネージャーから直接デーモンを呼び出す代わりに(本当にSysV initだけを使用しているか、ラッパースクリプトやUpstartなどの追加機能を使用していますか?)、
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
デーモンはサービスマネージャの子プロセスにはならないため、正しいプロセスにシグナルを送信する必要があります。それを行う方法は、デーモンがどのように開始され、どのように開始されるかによって異なります。
それはだ技術的には可能端末に実行中のプロセスをアタッチするが、これは生産システムのために外に間違いなくあるので、あなたは、プログラムがクラッシュしますリスクがあります。
この-L
オプションは、画面にウィンドウに表示されるすべてのものをファイルに書き込みます。ファイル名はで与えられているdaemon.screenrc
とのlogfile
指示。