systemd
다음과 같이 진행되는 서비스가 있습니다 .
[Service]
ExecStart=/usr/local/bin/binary subcommand
User=my-user
Group=my-group
EnvironmentFile=/etc/my-service/config
내용을 바꾸는 중이에요/etc/my-service/config
daemon-reload
서비스를 실행하거나 다시 로드해야 합니까 ?
ExecReload
내 유닛 파일에는 지시문이 없습니다. 이것이 systemctl reload my-service
동작에 영향을 줍니까?
답변1
또한 기본 프로세스 에서도 읽히지 daemon-reload
않습니다 .reload
EnvironmentFile=
매뉴얼 페이지에는 EnvironmentFile=
프로세스가 실행되기 직전에 나열된 파일을 읽을 것이라고 나와 있습니다.
- 이는 파일을 읽게 되거나 이를 의미합니다
start
.restart
그 이유는start
또는restart
프로세스를 수행하기 때문입니다. - 이는 또한 not 또는 단위
daemon-reload
로 영향이 없음 을 보여줍니다.daemon-reload
start
restart
- 이는 메인 프로세스가 생성되지 않기
reload
때문에 영향이 없다는 것을 보여줍니다 .reload
구성을 다시 로드하기 위해 기본 프로세스에 신호를 보낼 수 있는 기회만 제공합니다.ExecReload=
정의가 없는 경우 특히 그렇습니다.
지원 실험
$ systemctl --user cat env.service
# /home/stew/.config/systemd/user/env.service
[Service]
ExecStart=/bin/bash -c "while true; do sleep 1; echo $EXAMPLE_ENV; done"
EnvironmentFile=%h/env
$ cat ~/env
EXAMPLE_ENV="Hi"
$ systemctl --user start env.service
그런 다음 작업 중에 로그를 모니터링합니다.
$ journalctl --user -u env.service -f
...
Feb 11 15:35:47 stewbian systemd[1108]: Started env.service.
Feb 11 15:35:48 stewbian bash[911848]: Hi
Feb 11 15:35:49 stewbian bash[911848]: Hi
그런 다음 환경 파일을 변경했는데 출력에 변화가 없었습니다.
$ sed -i -e 's/Hi/Yo/' ~/env
...
Feb 11 15:37:13 stewbian bash[911848]: Hi
Feb 11 15:37:14 stewbian bash[911848]: Hi
Feb 11 15:37:15 stewbian bash[911848]: Hi
그런 다음 a를 시도했지만 systemctl reload
출력에 변화가 없는 것을 확인했습니다.
$ systemctl --user reload env.service
Failed to reload env.service: Job type reload is not applicable for unit env.service.
...
Feb 11 15:38:14 stewbian bash[911848]: Hi
Feb 11 15:38:15 stewbian bash[911848]: Hi
그런 다음 a를 시도했지만 daemon-reload
출력에 변화가 없는 것을 확인했습니다.
$ systemctl --user daemon-reload
...
Feb 11 15:38:46 stewbian bash[911848]: Hi
Feb 11 15:38:47 stewbian bash[911848]: Hi
그런 다음 재부팅을 시도하고 변경 사항을 확인했습니다.
$ systemctl --user restart env.service
...
Feb 11 15:39:29 stewbian bash[911848]: Hi
Feb 11 15:39:30 stewbian bash[911848]: Hi
Feb 11 15:39:30 stewbian systemd[1108]: Stopping env.service...
Feb 11 15:39:30 stewbian systemd[1108]: Stopped env.service.
Feb 11 15:39:30 stewbian systemd[1108]: Started env.service.
Feb 11 15:39:31 stewbian bash[912531]: Yo
Feb 11 15:39:32 stewbian bash[912531]: Yo
ExecReload=/bin/bash -c 'echo $EXAMPLE_ENV
장치에 추가할 흥미로운 점 중 하나입니다 . 이 경우 나는 이것을 얻습니다:
Feb 11 15:58:24 stewbian bash[914611]: Hi
Feb 11 15:58:25 stewbian bash[914611]: Hi
Feb 11 15:58:26 stewbian systemd[1108]: Reloading env.service...
Feb 11 15:58:26 stewbian bash[914640]: Yo
Feb 11 15:58:26 stewbian systemd[1108]: Reloaded env.service.
Feb 11 15:58:26 stewbian bash[914611]: Hi
Feb 11 15:58:27 stewbian bash[914611]: Hi
따라서 여기서는 시작하기 전에 실제로 읽히지 systemd
만 새 환경만 새 프로세스로 전달되는 것을 볼 수 있습니다. 기존 프로세스의 컨텍스트는 변경되지 않습니다.EnvironmentFile=
ExecReload=
시스템 환경 변수 대체가 행을 구문 분석하는 동안 아무 영향도 미치지 않았는지 확인하기 위해 이를 별도의 스크립트에 넣어 bash
다시 시도했습니다 Exec*=
. 동일한 결과입니다.
지원 문서
man systemd.exec
:
EnvironmentFile=
...
The files listed with this directive will be read shortly before
the process is executed (more specifically, after all processes
from a previous unit state terminated. This means you can
generate these files in one unit state, and read it with this
option in the next. The files are read from the file system of
the service manager, before any file system changes like bind
mounts take place).
man systemctl
:
reload PATTERN...
Asks all units listed on the command line to reload their
configuration. Note that this will reload the service-specific
configuration, not the unit configuration file of systemd. If you
want systemd to reload the configuration file of a unit, use the
daemon-reload command. In other words: for the example case of
Apache, this will reload Apache's httpd.conf in the web server,
not the apache.service systemd unit file.
This command should not be confused with the daemon-reload
command.
daemon-reload
Reload the systemd manager configuration. This will rerun all
generators (see systemd.generator(7)), reload all unit files, and
recreate the entire dependency tree. While the daemon is being
reloaded, all sockets systemd listens on behalf of user
configuration will stay accessible.
This command should not be confused with the reload command.
In other words: for the example case of Apache, this will reload Apache's httpd.conf in the
web server, not the apache.service systemd unit file.
This command should not be confused with the daemon-reload command.
man systemd.service
:
ExecReload=
Commands to execute to trigger a configuration reload in the
service. This argument takes multiple command lines, following
the same scheme as described for ExecStart= above. Use of this
setting is optional. Specifier and environment variable
substitution is supported here following the same scheme as for
ExecStart=.
One additional, special environment variable is set: if known,
$MAINPID is set to the main process of the daemon, and may be
used for command lines like the following:
ExecReload=kill -HUP $MAINPID
Note however that reloading a daemon by sending a signal (as with
the example line above) is usually not a good choice, because
this is an asynchronous operation and hence not suitable to order
reloads of multiple services against each other. It is strongly
recommended to set ExecReload= to a command that not only
triggers a configuration reload of the daemon, but also
synchronously waits for it to complete. For example, dbus-
broker(1) uses the following:
ExecReload=busctl call org.freedesktop.DBus \
/org/freedesktop/DBus org.freedesktop.DBus \
ReloadConfig