systemd 서비스가 구성 파일의 변경 사항을 인식하도록 합니다.

systemd 서비스가 구성 파일의 변경 사항을 인식하도록 합니다.

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않습니다 .reloadEnvironmentFile=

매뉴얼 페이지에는 EnvironmentFile=프로세스가 실행되기 직전에 나열된 파일을 읽을 것이라고 나와 있습니다.

  • 이는 파일을 읽게 되거나 이를 의미합니다 start. restart그 이유는 start또는 restart프로세스를 수행하기 때문입니다.
  • 이는 또한 not 또는 단위 daemon-reload로 영향이 없음 을 보여줍니다.daemon-reloadstartrestart
  • 이는 메인 프로세스가 생성되지 않기 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

관련 정보