在 Linux 里,source 和 systemctl daemon-reload 都是"重新加载"的意思,但它们作用的对象完全不同。
source作用于当前 shellsystemctl daemon-reload作用于 systemd
这两个命令很常见,也很容易混。
一、source 是什么
source 的作用是:让当前终端重新执行某个文件的内容。
最常见的用途是让环境变量立刻生效。
比如你修改了:
~/.bashrc~/.profile~/.zshrc
然后不想重新打开终端,就可以执行:
bash
source ~/.bashrc
或者:
bash
. ~/.bashrc
它的作用范围
source 只对当前终端会话有效。
也就是说:
- 你在 A 终端执行
source ~/.bashrc - B 终端不会受到影响
- 新打开的终端会自动读取这些配置
- 已经打开的终端不会自动变
简单理解
你可以把 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文件
例如你新建了:
bash
/etc/systemd/system/nginx-restart.service
然后如果直接执行:
bash
systemctl start nginx-restart.service
有时 systemd 还不知道这个新 unit,可能会报找不到 unit。
这时先执行:
bash
systemctl daemon-reload
再启动就正常了。
常见搭配
改完 unit 文件后,通常这么做:
bash
systemctl daemon-reload
systemctl restart xxx.service
如果是 timer:
bash
systemctl 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-reload |
systemd | 重新读取 service/timer 配置 | 整个 systemd |
五、最简记法
text
source:重新加载当前终端的配置
systemctl daemon-reload:重新加载 systemd 的 unit 配置
text
source 只影响当前 shell;daemon-reload 只负责让 systemd 认新配置,不等于重启服务。
六、实际操作建议
改了 shell 配置文件
bash
source ~/.bashrc
改了 systemd unit 文件
bash
systemctl daemon-reload
systemctl restart 服务名
新建了 systemd service 或 timer
bash
systemctl daemon-reload
systemctl enable --now 服务名
七、结论
source 和 systemctl daemon-reload 都是"重新加载",但对象完全不同:
source管当前终端的 shell 配置systemctl daemon-reload管 systemd 的服务配置
它们常见的坑两个:
source只对当前终端有效daemon-reload不只是改文件才需要,新建 unit 后也必须执行