[systemd-devel] systemd-journald, syslog.socket and service activation
Thomas HUMMEL
thomas.hummel at pasteur.fr
Thu Jul 2 13:09:40 UTC 2020
Hello,
On CentOS Linux release 8.1.1911 (Core) x86_64 running systemd-239 and
rsyslog-8.37.0 I'm experiencing a sometime strange (to me) activation of
rsyslog.service when I would expect it to fail for a dependency reason.
Note : I know how to make rsyslog and systemd coexist and I did
successfully set it up like below. My post is about a test case I
stumbled upon which I cannot explain and not about how to properly set
rsyslog/systemd up.
My production setup is like this:
1. make systemd-journald forward to rsyslog :
[Journal]
ForwardToSyslog=yes
2. state an activation dependency of rsyslog.service on syslog.socket
(/run/systemd/journal/syslog) and have rsyslog.service aliased to
syslog.service:
[Unit]
Requires=syslog.socket
[Install]
Alias=syslog.service
3. let rsyslog manage its own sockets, leaving the ones passed by systemd:
module
(
load="imuxsock"
SysSock.Use="on"
SysSock.Unlink="on"
)
This setup works well. In particular, I can see, as expected:
- /dev/log beeing symlinked /run/systemd/journal/dev-log
- /run/systemd/journal/syslog socket being pulled in as a dependency and
used by both journald and rsyslog
Now, when I comment (and remove) the Alias:
[Unit]
Requires=syslog.socket
[Install]
;Alias=syslog.service
and reboot the host. I end up, as expected with:
- rsyslog.service being dead
- /run/systemd/journal/syslog not having been created
- still /dev/log -> /run/systemd/journal/dev-log
debug logs showing:
Jul 02 12:27:15 maestro-log systemd[1]: rsyslog.service: Installed new
job rsyslog.service/start as 251
Jul 02 12:27:15 maestro-log systemd[1]: rsyslog.service: Job
rsyslog.service/start finished, result=dependency
Jul 02 12:27:15 maestro-log systemd[1]: Dependency failed for System
Logging Service.
Jul 02 12:27:15 maestro-log systemd[1]: rsyslog.service: Job
rsyslog.service/start failed with result 'dependency'.
But when I manually start rsyslog.service (systemctl start
rsyslog.service),again, as expected, a message about the failed
dependency is printed:
# systemctl start rsyslog
A dependency job for rsyslog.service failed. See 'journalctl -xe' for
details.
BUT rsyslog service (and daemon) are actually running:
Active: active (running) since Thu 2020-07-02 14:45:37 CEST; 2min
10s ago
[The fact that the process was run can also be confirmed by the override
of the /dev/log symlink by an actual /dev/log socket managed by rsyslog
as it could not detect the journald /run/systemd/journal/syslog socket
(which, as expected is still not created)]
Debug logs (I skipped the d-bus lines) show something like:
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Trying to
enqueue job rsyslog.service/start/replace
Jul 02 12:51:13 maestro-log systemd[1]: syslog.socket: Installed new job
syslog.socket/start as 923
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Installed new
job rsyslog.service/start as 922
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Enqueued job
rsyslog.service/start as 922
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Passing 0 fds
to service
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: About to
execute: /usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Forked
/usr/sbin/rsyslogd as 2267
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Changed dead ->
start
Jul 02 12:51:13 maestro-log systemd[1]: Starting System Logging Service...
Jul 02 12:51:13 maestro-log systemd[1]: syslog.socket: Socket service
syslog.service not loaded, refusing.
Jul 02 12:51:13 maestro-log systemd[1]: syslog.socket: Job
syslog.socket/start finished, result=failed
Jul 02 12:51:13 maestro-log systemd[1]: Failed to listen on Syslog Socket.
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Job
rsyslog.service/start finished, result=dependency
Jul 02 12:51:13 maestro-log systemd[1]: Dependency failed for System
Logging Service.
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Job
rsyslog.service/start failed with result 'dependency'.
Jul 02 12:51:13 maestro-log systemd[2267]: rsyslog.service: Executing:
/usr/sbin/rsyslogd -n
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Got
notification message from PID 2267 (READY=1)
Jul 02 12:51:13 maestro-log systemd[1]: rsyslog.service: Changed start
-> running
Question 1:
------------
How is it that despite a Requires= not satisfied the service is run
(and that this behavior is different at boot time) ?
Question 2:
-----------
Where (is it hard coded) can I get the info telling me that
syslog.socket unit can socket-activate the syslog.service (hence the
need of the Alias I guess) ?
Question 3:
------------
I can also issue, right after boot several systemctl start rsyslog
command. The first few ones will print the 'A dependency job for
rsyslog.service failed. See 'journalctl -xe' for details.' message, but
ultimately, the last one will launch rsyslog service without any message :
# systemctl start rsyslog
A dependency job for rsyslog.service failed. See 'journalctl -xe' for
details.
# systemctl start rsyslog
A dependency job for rsyslog.service failed. See 'journalctl -xe' for
details.
# systemctl start rsyslog
A dependency job for rsyslog.service failed. See 'journalctl -xe' for
details.
# systemctl start rsyslog
A dependency job for rsyslog.service failed. See 'journalctl -xe' for
details.
# systemctl start rsyslog
#
rsyslog service will end up running but still no syslog journald socket
(which seems normal considering the dependency but weird as I did not
have any message about it at the last start command)
# ls -l /run/systemd/journal/syslog
ls: cannot access '/run/systemd/journal/syslog': No such file or directory
What am I missing ?
Note: rsyslog service is of Type notify and has a Restart value of no-fail
Thanks for your help
--
Thomas HUMMEL
More information about the systemd-devel
mailing list