Linux 中 `source` 和 `systemctl daemon-reload` 的区别与踩坑点
在 Linux 里source和systemctl daemon-reload都是“重新加载”的意思但它们作用的对象完全不同。source作用于当前 shellsystemctl daemon-reload作用于 systemd这两个命令很常见也很容易混。一、source是什么source的作用是让当前终端重新执行某个文件的内容。最常见的用途是让环境变量立刻生效。比如你修改了~/.bashrc~/.profile~/.zshrc然后不想重新打开终端就可以执行source~/.bashrc或者.~/.bashrc它的作用范围source只对当前终端会话有效。也就是说你在 A 终端执行source ~/.bashrcB 终端不会受到影响新打开的终端会自动读取这些配置已经打开的终端不会自动变简单理解你可以把source理解成把这个文件内容在当前 shell 里重新执行一遍。二、systemctl daemon-reload是什么systemctl daemon-reload的作用是让 systemd 重新读取 unit 配置文件。常见的 unit 文件包括/etc/systemd/system/xxx.service/etc/systemd/system/xxx.timer/lib/systemd/system/xxx.service它的作用不是重启服务而是让 systemd 认识到你刚刚改过或新建了配置。常见场景你在下面这些情况下需要它新建了一个.service文件新建了一个.timer文件修改了现有的.service文件修改了现有的.timer文件例如你新建了/etc/systemd/system/nginx-restart.service然后如果直接执行systemctl start nginx-restart.service有时 systemd 还不知道这个新 unit可能会报找不到 unit。这时先执行systemctl daemon-reload再启动就正常了。常见搭配改完 unit 文件后通常这么做systemctl daemon-reload systemctl restart xxx.service如果是 timersystemctl daemon-reload systemctl restart xxx.timer三、一个最容易踩的坑source的误区很多人以为我在一个终端里source ~/.bashrc之后所有终端都会生效。这是错的。实际上它只影响当前 shell。所以如果你在多个窗口里操作别忘了已开的窗口要自己重新source或者直接重新打开终端daemon-reload的误区很多人以为只有修改.service文件才需要daemon-reload。这也不完整。实际上新建.service文件要daemon-reload新建.timer文件要daemon-reload修改.service/.timer文件也要daemon-reload否则 systemd 可能还在用旧缓存。四、最简对比命令作用对象典型用途作用范围source当前 shell让环境变量、alias、生效仅当前终端systemctl daemon-reloadsystemd重新读取 service/timer 配置整个 systemd五、最简记法source重新加载当前终端的配置 systemctl daemon-reload重新加载 systemd 的 unit 配置source 只影响当前 shelldaemon-reload 只负责让 systemd 认新配置不等于重启服务。六、实际操作建议改了 shell 配置文件source~/.bashrc改了 systemd unit 文件systemctl daemon-reload systemctl restart 服务名新建了 systemd service 或 timersystemctl daemon-reload systemctlenable--now服务名七、结论source和systemctl daemon-reload都是“重新加载”但对象完全不同source管当前终端的 shell 配置systemctl daemon-reload管 systemd 的服务配置它们常见的坑两个source只对当前终端有效daemon-reload不只是改文件才需要新建 unit 后也必须执行