上一篇文章簡單介紹了一下使用 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
記得關注長按點贊,期待後續分享哈。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!