暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

systemd入门2:启用(enable)与启动(start)的区别

编程初学者 2021-09-10
901

上一篇文章简单介绍了一下使用 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
复制


记得关注长按点赞,期待后续分享哈。


文章转载自编程初学者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论