我的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
的行为吗?
既
daemon-reload
不会也reload
不会EnvironmentFile=
被您的主进程读取。手册页说列出的文件
EnvironmentFile=
将在执行该过程之前不久被读取。start
或restart
将导致文件被读取。那是因为start
或restart
将执行该过程。daemon-reload
不会因为daemon-reload
没有start
或restart
单位而产生影响。reload
不会产生任何影响,因为reload
不创建主进程。它只提供了向主进程发送信号以重新加载其配置的机会。如果您没有ExecReload=
定义,则尤其如此。辅助实验
然后我在操作期间监控日志:
然后我更改了环境文件,看到输出没有变化
然后我尝试 a
systemctl reload
并看到输出没有变化:然后我尝试 a
daemon-reload
并看到输出没有变化:所以然后我尝试重新启动并查看更改。
一件有趣的事情是添加
ExecReload=/bin/bash -c 'echo $EXAMPLE_ENV
到单元中。在那种情况下,我得到这个:所以在这里你可以看到在启动之前
systemd
确实读过,但只会将新环境传递给新进程。它不会改变现有流程的环境。EnvironmentFile=
ExecReload=
我通过将这些
bash
东西放在一个单独的脚本中来重试这个,以确保 systemd 环境变量替换在解析行期间不会影响任何东西Exec*=
......结果相同。支持文档
man systemd.exec
:man systemctl
:man systemd.service
: