上一篇文章简单介绍了一下使用 systemctl 针对 systemd 单元进行的基础管理操作。不过在阅读相关文档的过程当中遇到了一些困惑。
和往常一样,但凡是在 Linux 中看到什么稀奇古怪,新式猎奇,都会调出man页面一探究竟。因为第一次接触 systemctl 命令,所以我就运行了:
man systemctl
我发现在 Unit Commands(单元命令)下,有一个 start 命令;而在 Unit File Commands 下,还有一个 enable 命令。突然我顿时慌了,感觉这几年的英文都白学了。原来这两个词的意思不一样啊。
吻住自己之后,仔细打量了一番两者的区别:
start:
enable:
洋洋洒洒600多字英文,看完我更慌了。好在认识的单词不多,拣我们认识的唠唠。
大概意思是,enable 命令运行的时候,后面需要跟上单元文件。如果你就给个单元名,那么enable命令会自动去各种单元文件的路径中搜索,寻找匹配单元名的文件。或者呢,你也可以给出指向单元文件的完整路径,这样就省得enable命令去一个个找了。不过如果这个路径不走寻常路,不在常规的单元文件路径当中,还会专门创建一个表征链接,熟悉Windows的朋友可以把它当作快捷方式。把这个奇葩单元文件连接到单元配置路径中去。确保比如 start 命令需要这个文件的时候,能够找着。
enable 命令还会根据单元文件的 [Install] 段落的内容,在特定路径下,生成表征链接(类似Windows的快捷方式文件),其中就有用于自动启动的路径。如果在自动启动的路径下,创建表征链接,这样系统开机启动后,回到这个路径来,挨个启动表征链接就完事了。
好奇心促使我又看了一眼 nginx 和 docker 的单元文件的内容,重点就是 [Install] 段落。
分别运行命令:
systemctl cat nginx
systemctl cat docker
nginx 和 docker 的 [install] 段落内容一模一样:
这里有个新名词叫 multi-user.target ,.target 其实也是单元文件,后续文章将进一步展开。大体上,.target就类似我们去快餐店点的套餐,一个套餐里面,有汉堡、可乐、土豆泥、沙拉、玩具等等。那么nginx 和 docker 就相当于是汉堡和可乐。Ubuntu启动以后,默认点了一份 multi-user.target 套餐,店小二一听,好嘞,这位爷。等小的我给您上菜啊。挨个启动 nginx 和 docker 。这样就实现了开机自动启动服务的操作。
说了这么多,还是没有提到 enable(启用)和 start(启动)的区别啊。
别急,下面专门有一段是说:别把 enable 和 start 搞混。看来和我一样水平的人不少啊。
enable 和 start 是互不相关的。一个单元可以启动不启用;也可以启用不启动。之前我们提到,enable会在不同的特定路径下,创建表征链接。nginx 和 docker 默认都是在自动启动的路径下创建表征链接,所以对应于它们的enable行为就是开机自动启动。除了自动启动之外,还有用于其它目的的特殊路径。比如在插入U盘时,启动服务的路径。这样enable的行为就是在插入U盘时,启动某个单元。
而 start 命令,针对服务单元的话,就只是为服务生成一个守护进程。
所以如果你希望Ubuntu在自动启动的时候,就能够启动nginx 的话,可以运行
sudo systemctl enable nginx
但是如果nginx 现在并没有在运行,即使运行上面这个命令,也不会启动nginx,除非重启电脑。想要开机自动启动nginx,同时现在就需要nginx运行的话,可以:
sudo systemctl enable nginx --now
记得关注长按点赞,期待后续分享哈。