web-dev-qa-db-ja.com

syslog-ngサービスがsystemdで開始しないが、コマンドは正常に機能する

CentOS 7に、EPELリポジトリからsyslog-ngをインストールしたばかりのバージョンを新しくインストールしました。

~: yum list | grep syslog
syslog-ng.x86_64                        3.5.6-1.el7                    @epel

Systemctlで起動しようとすると、次のように失敗します。

/usr/lib/systemd/system: systemctl start syslog-ng
Job for syslog-ng.service failed. See 'systemctl status syslog-ng.service' and 'journalctl -xn' for details.

ジャーナルを調べると、それらは「正常に開始する」ソケットへの依存関係であることがわかりますが、以下に示すように、プロセスは引数が正しくないというエラーを返します。

May 07 17:26:15 superserver.company.corp systemd[1]: Starting Syslog Socket.
May 07 17:26:15 superserver.company.corp systemd[1]: Listening on Syslog Socket.
May 07 17:26:15 superserver.company.corp systemd[1]: Starting System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
May 07 17:26:15 superserver.company.corp systemd[1]: Failed to start System Logger Daemon.
May 07 17:26:15 superserver.company.corp systemd[1]: Unit syslog-ng.service entered failed state.
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service holdoff time over, scheduling restart.
May 07 17:26:15 superserver.company.corp systemd[1]: Stopping System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: Starting System Logger Daemon...
May 07 17:26:15 superserver.company.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT

サービス構成ファイルを調べると、ソケットの依存関係と、サービスの開始に使用されるコマンドを確認できます。

[Service]
Type=notify
Sockets=syslog.socket
ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid

問題は、上記のコマンドを実行すると、正常に起動し、期待どおりに動作することです。

私の質問は、プログラムの起動コマンドを実行することとsystemdが同じプログラムを起動することの違いは何ですか?実際に何が問題なのかを調べるにはどうすればよいですか?


編集1

レイモンドが回答で提案したようにデバッグ出力を有効にしましたが、出力からはそれ以上はわかりません。

May 08 10:31:29 server.corp systemd[1]: Starting System Logger Daemon...
May 08 10:31:29 server.corp systemd[1]: About to execute: /usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
May 08 10:31:29 server.corp systemd[1]: Forked /usr/sbin/syslog-ng as 3121
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service changed dead -> start
May 08 10:31:29 server.corp systemd[1]: Set up jobs progress timerfd.
May 08 10:31:29 server.corp systemd[1]: Set up idle_pipe watch.
May 08 10:31:29 server.corp systemd[3121]: Executing: /usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
May 08 10:31:29 server.corp systemd[1]: Got notification message for unit syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: Got message
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: got STATUS=Starting up... (Fri May  8 10:31:29 2015
May 08 10:31:29 server.corp systemd[1]: Got notification message for unit syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: Got message
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: got STATUS=Starting up... (Fri May  8 10:31:29 2015
May 08 10:31:29 server.corp systemd[1]: Received SIGCHLD from PID 3121 (syslog-ng).
May 08 10:31:29 server.corp systemd[1]: Child 3121 (syslog-ng) died (code=exited, status=2/INVALIDARGUMENT)
May 08 10:31:29 server.corp systemd[1]: Child 3121 belongs to syslog-ng.service
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
May 08 10:31:29 server.corp systemd[1]: syslog-ng.service changed start -> failed
May 08 10:31:29 server.corp systemd[1]: Job syslog-ng.service/start finished, result=failed
May 08 10:31:29 server.corp systemd[1]: Failed to start System Logger Daemon. 

Syslog-ngプロセスの開始時に表示される警告がいくつかあるので(それが正しく開始されない原因はありません)、すべての出力を/ dev/nullにリダイレクトしましたが、最終結果は同じです。

また、補足として、systemdがsyslogを実行できない場合、システム全体が起動しなくなります。これは、kmesgにログを記録するカーネルオプションで無効にできます。

6

Debian 8.1でも同じ問題がありましたが、syslog-ngローカル構成を変更して、unix-dgramではなくunix-socketを使用するように修正しました。

このコメントはRedHat Bugzillaで

カスタムのsyslog-ng構成ファイルに関する注意

Systemdとsyslog-ngの古い構成ファイル間のunixソケットタイプの不一致により、カスタムのsyslog-ng構成を持つ人々は、アップグレードの問題に直面する可能性が最も高くなります。

  • systemdは/ dev/logをunix-dgramとして作成します
  • syslog-ng <3.2.5/dev/logがunix-stream(構成ファイル)であることが期待されています

ログメッセージソースの1つで「unix-stream( "/ dev/log")」を使用する場合は、手動で「unix-dgram( "/ dev/log")」に変更する必要があります。

6
Zanchey

私はまったく同じ問題を抱えていました(Debian 8.4、syslog-ng v3.5.6)。

Syslog-ng構成ファイル内の次の行をコメント化または削除してください。

unix-dgram("/dev/log");

から https://wiki.gentoo.org/wiki/Systemd#syslog-ng_source_for_systemd

1
faust

これをsyslog-ng.serviceに追加して修正:After = network.target

https://bugzilla.redhat.com/show_bug.cgi?id=1309345

# cat /usr/lib/systemd/system/syslog-ng.service
[Unit]
Description=System Logger Daemon
Documentation=man:syslog-ng(8)
After=network.target

[Service]
Type=notify
Sockets=syslog.socket
ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
ExecReload=/bin/kill -HUP $MAINPID
StandardOutput=null
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=syslog.service
0
borgified

多分追加してみてください:

Environment=SYSTEMD_LOG_LEVEL=debug

あなたのサービスユニットファイルに、そして何がダンプされるかを見てください?

Systemdが、syslog-ngを実行して、syslog-ngが正常に起動したことを確認しようとしているのかどうかも知りたいです。

systemctl status syslog-ng

ユニットファイルに一致する「ステータス」ディレクティブがないため、サービスが正しく起動しなかったと想定し、プロセスを強制終了しますか?

0
Raymond Bannan