web-dev-qa-db-ja.com

start-stop-daemonによって開始されたプロセスの標準出力をログに記録するにはどうすればよいですか?

私はinitスクリプトを使用して簡単なプロセスを実行しています。

start-stop-daemon --start --quiet --chuid $DAEMONUSER    \
    --make-pidfile --pidfile $PIDFILE --background       \
    --exec $DAEMON $DAEMON_ARGS

通常、$ DAEMONと呼ばれるプロセスは、ログ情報を標準出力に出力します。私が知る限り、このデータはどこにも保存されていません。

$ DAEMONの標準出力をどこかに書き込むか、ファイルに追加したいと思います。

私が知っている唯一の解決策は、$ DAEMONの代わりにシェルスクリプトを直接呼び出すようにstart-stop-daemonに指示することです。次に、スクリプトは$ DAEMONを呼び出してログファイルに書き込みます。ただし、デーモン自体を変更するような、このような一般的なタスクを解決する間違った方法と思われる追加のスクリプトが必要です。

114
joeytwiddle

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プロセスを探し、デーモンを実行している実際の子プロセスを無視します。

122
stormbeta

あなたがする必要があります:

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/を所有させることです。

46
youurayy

--no-closeの起動時にstart-stop-daemonパラメーターを使用して、デーモンの出力をキャプチャできるようになったようです。この 新機能 は、Debianのバージョン1.16.5以降のdpkgパッケージで利用可能です:

--backgroundでfdsを閉じることを無効にする新しい--no-closeオプションを追加します。

これにより、呼び出し側はデバッグのためにプロセスメッセージを確認したり、ファイル記述子をログファイルやsyslogなどにリダイレクトしたりすることができました。

40
Stéphane

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
11
little-dude

通常、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
5

古いメーリングリストの引用:

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を本当に使用する必要があるかどうかでしょうか?

4
joeytwiddle

「$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2>&1」がログファイルのファイル記述子を閉じるかどうかはわかりません...つまり、デーモンが永久に実行されている場合は、わかりませんそのlogrotateまたはディスク領域をクリーンアップする他のメカニズムが機能します。 >>ではなく>であるため、提案されたコマンドは、再起動時に既存のログも切り捨てます。デーモンがクラッシュし、自動的に再起動する理由を確認したい場合、それはあまり役に立ちません。

別のオプションは「$ DAEMON | logger」です。ロガーは、syslog(/ var/log/messages)に記録するコマンドです。 stderrも必要な場合は、「$ DAEMON 1>&2 | logger」を使用できると思います

3
nairbv

Bashであると仮定すると(他のシェルでも同様に許可される場合があります)、次の行:

exec >>/tmp/myDaemon.log

将来のすべての標準出力をそのファイルに送信します。これは、プログラム名のないexecが単にリダイレクトの魔法をかけるからです。 bash manページから:

コマンドが指定されていない場合、リダイレクトは現在のシェルで有効になります。

もちろん、このファイルの管理は別の問題です。

2
paxdiablo

どうですか:

Sudo -u myuser -i start-stop-daemon ...
1
jakub.piasecki