認識與使用systemctl命令

一、systemctl介紹

       通常,Linux 的啓動一直採用init進程。

       我們經常看到

$ sudo /etc/init.d/apache2 start

或者

$ service apache2 start


       這種方法有兩個缺點:

       一是啓動時間長。init進程是串行啓動,只有前一個進程啓動完,纔會啓動下一個進程。

       二是啓動腳本複雜。init進程只是執行啓動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。

       爲此,LINXU設計引入了Systemd

       它的設計目標是,爲系統的啓動和管理提供一套完整的解決方案。根據 Linux 慣例,字母d是守護進程(daemon)的縮寫。Systemd 這個名字的含義,就是它要守護整個系統。使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成爲系統的第一個進程(PID 等於 1),其他進程都是它的子進程。

   1.33.jpg

       通過上圖的命令,我們可以查看Systemd版本。

       總的來說,Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常複雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過於複雜,與操作系統的其他部分強耦合,違反”keep simple, keep stupid”的Unix 哲學。

       1.3.jpg

        上圖就是Systemd的架構圖,看着有點嚇人!


二、systemctl命令

       Systemd 並不是一個命令,而是一組命令,涉及到系統管理的方方面面。

       下面我來介紹幾個常用的命令


# 啓動redis服務

$ sudo systemctl start redis 

# 重啓redis服務

$ sudo systemctl restart redis

# 查看redis服務狀態

$ sudo systemctl status redis

# 重啓系統

$ sudo systemctl reboot

# 關閉系統,切斷電源

$ sudo systemctl poweroff

 

三、利用systemctl添加自定義服務

       在日常開發中,我們難免搭建各種各樣的服務,這時,我們可以利用systemctl添加我們需要的服務。

1.31.jpg

        以我的系統爲例,配置服務可以到上圖的目錄中,system存放了系統配置的服務,user目錄存放用戶自定義配置的服務,當然,你也可以把服務放到system中

1.32.jpg

          上圖是已經搭好的ECF服務,分別有Unit、Service、Install三個關鍵詞


[Unit] 

Description : 服務的簡單描述

Documentation :服務文檔

Before、After:定義啓動順序。Before=xxx.service,代表本服務在xxx.service啓動之前啓動。After=xxx.service,代表本服務在xxx.service之後啓動。

Requires:這個單元啓動了,它需要的單元也會被啓動;它需要的單元被停止了,這個單元也停止了。

Wants:推薦使用。這個單元啓動了,它需要的單元也會被啓動;它需要的單元被停止了,對本單元沒有影響。

[Service]

Type=simple(默認值):systemd認爲該服務將立即啓動。服務進程不會fork。如果該服務要啓動其他服務,不要使用此類型啓動,除非該服務是socket激活型。

Type=forking:systemd認爲當該服務進程fork,且父進程退出後服務啓動成功。對於常規的守護進程(daemon),除非你確定此啓動方式無法滿足需求,使用此類型啓動即可。使用此啓動類型應同時指定 PIDFile=,以便systemd能夠跟蹤服務的主進程。

Type=oneshot:這一選項適用於只執行一項任務、隨後立即退出的服務。可能需要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出之後仍然認爲服務處於激活狀態。

Type=notify:與 Type=simple 相同,但約定服務會在就緒後向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供。

Type=dbus:若以此方式啓動,當指定的 BusName 出現在DBus系統總線上時,systemd認爲服務就緒。

Type=idle: systemd會等待所有任務(Jobs)處理完成後,纔開始執行idle類型的單元。除此之外,其他行爲和Type=simple 類似。

PIDFile:pid文件路徑 

ExecStart:指定啓動單元的命令或者腳本,ExecStartPre和ExecStartPost節指定在ExecStart之前或者之後用戶自定義執行的腳本。Type=oneshot允許指定多個希望順序執行的用戶自定義命令。

ExecReload:指定單元停止時執行的命令或者腳本。

ExecStop:指定單元停止時執行的命令或者腳本。

PrivateTmp:True表示給服務分配獨立的臨時空間

Restart:這個選項如果被允許,服務重啓的時候進程會退出,會通過systemctl命令執行清除並重啓的操作。

RemainAfterExit:如果設置這個選擇爲真,服務會被認爲是在激活狀態,即使所以的進程已經退出,默認的值爲假,這個選項只有在Type=oneshot時需要被配置。

[Install]

Alias:爲單元提供一個空間分離的附加名字。

RequiredBy:單元被允許運行需要的一系列依賴單元,RequiredBy列表從Require獲得依賴信息。 

WantBy:單元被允許運行需要的弱依賴性單元,Wantby從Want列表獲得依賴信息。 

Also:指出和單元一起安裝或者被協助的單元。 

DefaultInstance:實例單元的限制,這個選項指定如果單元被允許運行默認的實例。

       好了,上面就是systemctl命令的概述,大家可以動手實踐一下。


四、總結

       通過systemctl命令,我們對自己創建的服務進行自定義添加和使用,對於現在主流的微服務架構來說,這個命令帶給我們很多便利的地方!


睿江雲官網鏈接:https://www.eflycloud.com/home?from=RJ0035


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章