出力をプロセスに送信するシェルスクリプトを作成する方法

出力をプロセスに送信するシェルスクリプトを作成する方法

現在の画面でサーバーコンソールプログラムを実行していますが、時々読んでコマンドを送信する必要があるからです。

アプリケーションをバックグラウンドでデーモンとして実行したい(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プログラムを使用してください。私が知る限り、tailGNU 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

関連情報