Linux 中 `source` 和 `systemctl daemon-reload` 的区别与踩坑点

在 Linux 里,sourcesystemctl daemon-reload 都是"重新加载"的意思,但它们作用的对象完全不同。

  • source 作用于当前 shell
  • systemctl 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 服务名

七、结论

sourcesystemctl daemon-reload 都是"重新加载",但对象完全不同:

  • source 管当前终端的 shell 配置
  • systemctl daemon-reload 管 systemd 的服务配置

它们常见的坑两个:

  • source 只对当前终端有效
  • daemon-reload 不只是改文件才需要,新建 unit 后也必须执行
相关推荐
神威难绷泪1 分钟前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
2401_862880825 分钟前
Linux应用层开发 --- 管道
linux·运维·c语言
NJCloud14 分钟前
OpenStack(四)——进阶篇之私有网络配置与块存储服务(Cinder)部署
linux·网络·云计算·openstack
隔窗听雨眠15 分钟前
TDengine在AIOps中的硬核实战:从时序数据存储到智能运维的完整落地路径
大数据·运维·tdengine
2601_9621282617 分钟前
Nginx知识详解(理论+实战更易懂)
运维·nginx
raindayinrain18 分钟前
深入理解Linux内核--ext文件系统,open/write/read/close执行流程,性能优化
linux·性能优化·文件系统·文件系统调用
Elastic 中国社区官方博客23 分钟前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化
淡海水28 分钟前
05-03-栈队列-PriorityQueue-TElement-TPriority-NET6优先队列语义与四叉堆实现
服务器·前端·c#·priorityqueue·clr·telement
土星云SaturnCloud30 分钟前
大型仓储AI视觉全场景落地实战:安全·效率·库存,32TOPS土星云边缘算力赋能分区部署
服务器·人工智能·ai·边缘计算
jing.wang_202536 分钟前
制作一个带用户操作界面的精简Linux操作系统
linux·服务器