124

私は init スクリプトを使用して、次のように開始される単純なプロセスを実行しています。

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

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

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

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

4

11 に答える 11

47

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

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/

于 2012-09-30T16:29:38.610 に答える
41

デーモン出力のキャプチャを--no-close開始するときに、パラメータを使用できるようになっているようです。start-stop-daemonこの新機能dpkg、Debianのバージョン1.16.5以降のパッケージで利用できます。

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

これにより、呼び出し元はデバッグ目的でプロセスメッセージを表示したり、ファイル記述子をログファイルやsyslogなどにリダイレクトしたりできるようになりました。

于 2012-12-21T14:26:51.947 に答える
14

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
于 2016-04-21T14:47:19.100 に答える
10

デーモンの出力をキャプチャしてファイルに保存するのはそれほど難しくありません。

start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas $DAEMON --no-close \
  -- $DAEMON_ARGS >> $LOGFILE 2>&1

ただし、このソリューションは には最適ではない可能性がありますlogrotate

出力を syslog にキャプチャする方がよい場合があります。Debian では、これは systemd サービスの動作と一致します。上記の例を書き直そうとする次の簡単な試みは、デーモンの停止後に 2 つの親のない (「ゾンビ」) プロセス (ロガーとデーモン) を残すため、間違っstart-stop-daemonています。

## Do not use this!
start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas /bin/sh \
  -- -c """exec $DAEMON $DAEMON_ARGS | /usr/bin/logger --tag $NAME"""

SIGTERMそれを機能させるには、からの受信時に子を終了するラッパーが必要start-stop-daemonです。幾つかある:

デュエンデ:
start-stop-daemon --start --background \
  --pidfile $PIDFILE \
  --startas /usr/sbin/duende \
  -- --pid $PIDFILE --chroot=/ --uid 65534 --ident $NAME \
  /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec ${DAEMON} $DAEMON_ARGS"""

注:uid=65534はユーザーnobodyです。

長所: 機能し、比較的簡単です。
短所: 4 つのプロセス (スーパーバイザーduende、特権が削除されたそのフォーク (ロガー)、suおよびデーモン自体)。必須--chroot; デーモンがすぐに終了した場合 (無効なコマンドなど) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"、正常に開始されたと報告します。

デーモン:
start-stop-daemon --start --pidfile $PIDFILE \
  --startas /usr/bin/daemon \
  -- --noconfig --name $NAME --stderr=syslog.info --stdout=syslog.info \
  -- /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec $DAEMON $DAEMON_ARGS"""

長所: 3 つのプロセス (スーパーバイザーdaemonsuおよびデーモン自体)。
短所:デーモンのコマンド ライン オプション$PIDFILEがわかりにくいため、管理が難しい。デーモンがすぐに終了した場合 (無効なコマンドなど) 、正常に開始されたと報告します。status_of_proc -p $PIDFILE "$DAEMON" "$NAME"

pipexec (勝者):

start-stop-daemon --start --background \
  --pidfile $PIDFILE --make-pidfile \
  --chuid $DAEMON_USER \
  --startas /usr/bin/pipexec -- -k \
   -- [ D $DAEMON $DAEMON_ARGS ] [ L /usr/bin/logger --tag $NAME ] '{D:2>D:1}' '{D:1>L:0}'

長所: 3 つのプロセス (スーパーバイザーpipexecloggerおよびデーモン自体)。デーモンがすぐに終了する場合 (無効なコマンドなど) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"、失敗を正しく報告します。
短所:なし。

これが勝者です。うまく機能しているように見える、最も簡単できちんとしたソリューションです。

于 2015-11-09T09:55:56.570 に答える
4

古いメーリングリストを引用する:

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を使用することが本当に必要かどうかということです。

于 2012-06-10T00:39:07.140 に答える
3

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

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

于 2013-01-21T20:45:41.073 に答える
2

それが bash であると仮定すると (ただし、他のシェルでもこれが許可される場合があります)、次の行:

exec >>/tmp/myDaemon.log

将来のすべての標準出力をそのファイルに送信します。これexecは、プログラム名を指定しないと、リダイレクト マジックが実行されるだけだからです。bashマニュアルページから:

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

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

于 2011-11-24T04:03:35.560 に答える
1

どうですか:

sudo -u myuser -i start-stop-daemon ...
于 2012-11-22T13:42:20.813 に答える