現在の画面でサーバーコンソールプログラムを実行していますが、時々読んでコマンドを送信する必要があるからです。
アプリケーションをバックグラウンドでデーモンとして実行したい(initを使用して起動/停止)。
記録することはできますが、tail -f
プロセスに入力を送信することはできません。
入力を読み書きできますが、まだバックグラウンドで実行するように設定する方法はありますか?
また、他のプロセス(たとえば、「Stop \ n」コマンドを送信できるシェルスクリプト)からデーモンに入力を送信できるようにしたいです。
答え1
パイプから読み取る、ファイルに書き込む
デーモンが任意のプロセスによって生成された入力を読み取るようにするには、そのプロセスをパイプに接続する必要があります。ここで、任意のプロセスは echo コマンドであり、別のコンテキストで実行されます。だから名前付きパイプ(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
GNU coreutils(Linuxや他の場所で見つかった)はこの点で安全です。
デーモンを停止すると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
。