Ubuntu 16.04でFlumeをシステムサービスとして実行しようとしています。/etc/systemd/system/flume-ng.service
[Unit]
Description=Apache Flume
[Service]
ExecStart=/usr/bin/nohup /opt/flume/current/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/opt/flume/current/bin/flume-ng agent stop
[Install]
WantedBy=multi-user.target
次の行を追加してみました。
StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log
これは私には効果がありません。systemctl daemon-reload
私は飛びました。systemctl restart flume-ng
これがどのように機能するかを知っている人はいますか?
答え1
リダイレクト
以下はsystemd v236以降にのみ適用されます。
StandardOutput=file:/var/log/flume-ng/log1.log
StandardError=file:/var/log/flume-ng/log2.log
記録によるとここ。
systemdがv236より前の場合は、次のものを使用できます。
ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >/var/log/flume-ng/log1.log 2>/var/log/flume-ng/log2.log'
これにより、サービスが再起動されるたびにログファイルの内容全体が上書きされます。
追加
サービスの再起動中にファイルログを保持し、新しいログ行のみを追加するには、次の手順を実行します。
# Works only in systemd v240 and newer!
# (but backported to e.g. RHEL8)
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
systemdがv240より古い場合は、次のものを使用できます。
ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
exec
my_binary
つまり、フォーキングなしでリダイレクトを設定した後、シェルプログラムがそのプログラムに置き換えられることを意味します。したがって、my_binary
自分で実行することとは違いはありませんExecStart=
。
答え2
ExecStart=/usr/bin/nohup …
これは間違っています。それを削除します。このサービスは対話型ログインセッションで実行されていません。まず、切断信号を送信するための制御端末またはセッションリーダはありません。
ExecStart=… &
これは間違っています。それを削除します。これはシェルスクリプトではありません。 &
特別なシェルのような意味がなく、とにかくサービスを開始する誤った方法です。
標準出力=/var/log/flume-ng/log1.log 標準エラー=/var/log/flume-ng/log2.log
これらはすべて間違っていました。これを使用しないでください。システムすでに送りましたサービスプロセスの標準出力とエラーは、サービスユニットでそのような設定なしでログに記録されます。次のコマンドを使用して表示できます。
Journalctl -e -u Flume-ng.service
答え3
上書きせずにファイルにログを記録するには(system.dバージョン240+が必要です):
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
または
StandardOutput=append:/var/log/flume-ng/log.log
StandardError=inherit
答え4
出力がまったく出ない場合は、まずスクリプトをテストする必要があります。
たとえば、Pythonスクリプトは出力ストリームをバッファリングします(ただし、コンソールでテストするのではなく、パイプで接続したときのみ)。したがって、バッファがフラッシュされるまでログメッセージは表示されません。
-u
これを防ぐには、スイッチ(python3 -u script
)を指定するか、PYTHONUNBUFFERED
変数を設定してください。
Environment=PYTHONUNBUFFERED=1