私はinitスクリプトを使用して簡単なプロセスを実行しています。
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
通常、$ DAEMONと呼ばれるプロセスは、ログ情報を標準出力に出力します。私が知る限り、このデータはどこにも保存されていません。
$ DAEMONの標準出力をどこかに書き込むか、ファイルに追加したいと思います。
私が知っている唯一の解決策は、$ DAEMONの代わりにシェルスクリプトを直接呼び出すようにstart-stop-daemonに指示することです。次に、スクリプトは$ DAEMONを呼び出してログファイルに書き込みます。ただし、デーモン自体を変更するような、このような一般的なタスクを解決する間違った方法と思われる追加のスクリプトが必要です。
Ypocatの答えを拡張するには、コメントさせてくれないので:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--startas /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"
exec
を使用してデーモンを実行すると、bashの親だけでなく、子プロセスを正しく停止するための停止が可能になります。
--startas
の代わりに--exec
を使用すると、プロセスがそのpidによって正しく検出され、startが複数回呼び出された場合にデーモンの複数のインスタンスが誤って開始されなくなります。そうでない場合、start-stop-daemonは/ bin/bashプロセスを探し、デーモンを実行している実際の子プロセスを無視します。
あなたがする必要があります:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec /bin/bash -- -c "$DAEMON $DAEMON_ARGS > /var/log/some.log 2>&1"
また、--chuid
または--user
を使用する場合は、ユーザーが/var/log
または既存の/var/log/some.log
に書き込みできることを確認してください。最良の方法は、そのユーザーに/var/log/subdir/
を所有させることです。
--no-close
の起動時にstart-stop-daemon
パラメーターを使用して、デーモンの出力をキャプチャできるようになったようです。この 新機能 は、Debianのバージョン1.16.5以降のdpkg
パッケージで利用可能です:
--backgroundでfdsを閉じることを無効にする新しい--no-closeオプションを追加します。
これにより、呼び出し側はデバッグのためにプロセスメッセージを確認したり、ファイル記述子をログファイルやsyslogなどにリダイレクトしたりすることができました。
Openrc(たとえばgentooまたはAlpine Linuxのデフォルト)では、start-stop-daemon
には-1
および-2
オプションがあります:
-1、--stdout stdoutをファイルにリダイレクトします
-2、--stderr stderrをファイルにリダイレクトします
だからあなたは書くことができます:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS -1 $LOGFILE -2 $LOGFILE
通常、start-stop-daemon
は、バックグラウンドで実行されるときに標準ファイル記述子を閉じます。 start-stop-daemon
のmanページから:
-C、-no-close
デーモンをバックグラウンドに強制するときにファイル記述子を閉じないでください。デバッグの目的でプロセス出力を確認したり、ファイル記述子をリダイレクトしてプロセス出力を記録したりするために使用されます。 --backgroundを使用する場合のみ関連します。
これは私のために働いた:
start-stop-daemon -b -C -o -c \
$DAEMON_USER -S -x $DAEMON > $DAEMON_LOG 2>&1
古いメーリングリストの引用:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
簡単な方法で、おそらくstart-stop-daemonのみを使用したい場合は、以下を含む小さなスクリプトを作成する方法があります。
#!/bin/sh exec /home/boinc/boinc/boinc > /home/boinc/log/boinc.log
そして、そのスクリプトをstart-stop-daemonの引数として使用します。
おそらく本当の疑問は、そもそもstart-stop-daemonを本当に使用する必要があるかどうかでしょうか?
「$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2>&1」がログファイルのファイル記述子を閉じるかどうかはわかりません...つまり、デーモンが永久に実行されている場合は、わかりませんそのlogrotateまたはディスク領域をクリーンアップする他のメカニズムが機能します。 >>ではなく>であるため、提案されたコマンドは、再起動時に既存のログも切り捨てます。デーモンがクラッシュし、自動的に再起動する理由を確認したい場合、それはあまり役に立ちません。
別のオプションは「$ DAEMON | logger」です。ロガーは、syslog(/ var/log/messages)に記録するコマンドです。 stderrも必要な場合は、「$ DAEMON 1>&2 | logger」を使用できると思います
Bashであると仮定すると(他のシェルでも同様に許可される場合があります)、次の行:
exec >>/tmp/myDaemon.log
将来のすべての標準出力をそのファイルに送信します。これは、プログラム名のないexec
が単にリダイレクトの魔法をかけるからです。 bash
manページから:
コマンドが指定されていない場合、リダイレクトは現在のシェルで有効になります。
もちろん、このファイルの管理は別の問題です。
どうですか:
Sudo -u myuser -i start-stop-daemon ...