轉載。
systemd核心概念unit(單元)類型:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
cd /usr/lib/systemd/system
ls -l
常見unit類型 :
- service :文件擴展名爲.service, 用於定義系統服務
- target :文件擴展名爲.target,用於對 unit 進行邏輯分組,引導其他 unit 的執行。它替代了 SysV 中運行級別的作用,並提供更靈活的基於特定設備事件的啓動方式。例如 multi-user.target 相當於過去的運行級別5,而 bluetooth.target 在有藍牙設備接入時就會被觸發
- device :用於定義內核識別的設備
- mount:定義文件系統掛載點
- socket:用於標識進程間通信用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
- snapshot :管理系統快照
- swap:用於標識swap設備
- automount :文件系統的自動掛載點
- path:用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務
最常用的大概是 service 和 target。
管理一個service 文件
systemctl 提供了一組子命令來管理單個的 unit,其命令格式爲:
systemctl [command] [unit]
command 主要有:
start:立刻啓動後面接的 unit。
stop:立刻關閉後面接的 unit。
restart:立刻關閉後啓動後面接的 unit,亦即執行 stop 再 start 的意思。
reload:不關閉 unit 的情況下,重新載入配置文件,讓設置生效。
enable:設置下次開機時,後面接的 unit 會被啓動。
disable:設置下次開機時,後面接的 unit 不會被啓動。
status:目前後面接的這個 unit 的狀態,會列出有沒有正在執行、開機時是否啓動等信息。
is-active:目前有沒有正在運行中。
is-enabled:開機時有沒有默認要啓用這個 unit。
kill :不要被 kill 這個名字嚇着了,它其實是向運行 unit 的進程發送信號。
show:列出 unit 的配置。
mask:註銷 unit,註銷後你就無法啓動這個 unit 了。
unmask:取消對 unit 的註銷
測試一個service 文件。比如nginx
cat nginx.service
[root@manager system]# cat nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
大致分爲三塊
Unit Service Install 詳細解釋 可以看大神博客 不知道允不允許貼鏈接
https://www.csdn.net/article/2015-02-27/2824034
Unit 段
- Description 一段描述這個Unit文件的文字。
- After 在後面列出的所有模塊啓動完成後纔會啓動當前服務
Service 段
- Type 服務的類型,常用的有 simple(默認類型) 和 forking。默認的 simple 類型可以適應於絕大多數的場景,因此一般可以忽略這個參數的配置。而如果服務程序啓動後會通過 fork 系統調用創建子進程,然後關閉應用程序本身進程的情況,則應該將 Type 的值設置爲 forking,否則 systemd 將不會跟蹤子進程的行爲,而認爲服務已經退出。
- PIDFile 服務運行時進程文件位置
- ExecStartPre 指定在啓動執行 ExecStart 的命令前的準備工作,可以有多個
- ExecStart 指定服務啓動的主要命令,在每個配置文件中只能使用一次
- ExecReload 重新加載服務所需執行的主要命令
Install 段
這個段中的配置與 Unit 有幾分相似,但是這部分配置需要通過 systemctl enable 命令來激活,並且可以通過 systemctl disable 命令禁用。另外這部分配置的目標模塊通常是特定啓動級別的 .target 文件,用來使得服務在系統啓動時自動運行。
- WantedBy 列出的是依賴當前服務的模塊。
上面使用的是 “WantedBy=multi-user.target” 表明當系統以多用戶方式(默認的運行級別)啓動時,這個服務需要被自動運行。當然還需要 systemctl enable 激活這個服務以後自動運行纔會生效。
使用systemctl 管理服務。
比如還是 nginx 後面的服務名就是要啓動的服務
- 啓動服務
systemctl start nginx
- 停止服務
systemctl stop nginx
- 重啓服務
systemctl restart nginx
- 查看服務狀態
- 設置開機自動啓動服務
systemctl enable nginx
- 取消開機自動啓動
systemctl disable nginx
深入考慮,這個也不算是開機啓動。而是開機運行在multi-user 模式下,multi-user 會啓動該服務,這又和target 有關係。下一節在學習。
- 註銷服務
systemctl mask nginx
一旦註銷,服務就會無法啓動
- 取消註銷
systemctl unmask nginx
取消註銷後服務纔可以重新啓動。
- 查看服務是否運行
systemctl is-active nginx
- 查看服務是否開機自啓
systemctl is-enabled nginx
- 查看服務依賴關係
systemctl list-dependencies nginx
systemctl list-dependencies nginx
查看nginx這個unit依賴的其它unit 如果加上–reverse 就是反向解析哪些unit依賴nginx
具體可以 使用 systemctl -h
查看幫助。
systemctl 也兼容了service。嘗試執行一個命令時也會在/etc/init.d目錄 查找
target 文件
這個target的解釋,大約是一組unit。有些target可以看做一種運行狀態,在這個運行狀態中,啓動了那些unit。
看其他博客解釋,很像是之前的運行級別概念,但是又不全是。
爲其他配置單元進行邏輯分組。它們本身實際上並不做什麼,只是引用其他配置單元而已,這樣便可以對配置單元做一個統一的控制,就可以實現大家都非常熟悉的運行級別的概念。比如,想讓系統進入圖形化模式,需要運行許多服務和配置命令,這些操作都由一個個的配置單元表示,將所有的這些配置單元組合爲一個目標(target),就表示需要將這些配置單元全部執行一遍,以便進入目標所代表的系統運行狀態。
查看當前 運行target, Get the name of the default target
systemctl get-default
顯示的 multi-user.target
應該是一個比較常用的 target了。我沒有安裝圖形界面。
查看當前target 啓動了哪些服務。後面沒有帶unit就是查看默認target 依賴那些unit。
systemctl list-dependencies
可以看到 target 確實應該是一個unit 組的概念。運行模式也被看做一個target,只是這個target包含的unit比較多。
切換系統運行模式。(再次說一遍,但是自己也不確定對不對的理解。運行模式是一個target。但應該不是所有target都可以當成運行模式)
systemctl isolate NAME
NAME表示target。比如切換到multi-user 模式。。。這個。儘管本來就是multi模式
systemctl isolate multi-user
在一般情況下,使用上述 isolate 的方式即可完成不同 target 的切換。不過爲了方便起見,systemd 也提供了
幾個簡單的指令用來切換操作模式,大致如下所示:
sudo systemctl poweroff # 系統關機
sudo systemctl reboot # 重新開機
sudo systemctl suspend # 進入暫停模式
sudo systemctl hibernate # 進入休眠模式
sudo systemctl rescue # 強制進入救援模式
sudo systemctl emergency # 強制進入緊急救援模式
如果看成運行級別 大概是
級別0:runlevel0.target或shutdown.target
級別1:runlevel1.target或rescue.target
級別2:runlevel2.target或multi-user.target
級別3:runlevel3.target或multi-user.target
級別4:runlevel4.target或multi-user.target
級別5:runlevel5.target或graphical.taget
級別6:runlevel6.targe或reboot.target
關於開機自啓的學習
nginx 爲例
查看當前的運行模式
systemctl get-default
查看該target的依賴關係。
systemctl list-dependencies multi-user.target
內容很多。表示了這個模式依賴的一些unit。猜測設置開機啓動 就是 將 nginx加入成爲multi-user的依賴。
設置開機啓動查看提示
[root@manager ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
創建了一個軟鏈接。
/etc/systemd/system/multi-user.target.wants/nginx.service
指向了
/usr/lib/systemd/system/nginx.service
查看目錄
/etc/systemd/system/multi-user.target.wants
cd /etc/systemd/system/multi-user.target.wants
ls -l
可以看到是一些軟鏈接文件。根據前面service文件解釋,wants觸發啓動列出的每個 Unit 模塊,而不去考慮這些模塊啓動是否成功。wants 目錄應該是target 要啓動的所有unit。裏面有剛纔加入的 nginx.service
再次查看multi-user的依賴。可以發現有 nginx了
查看總體運行情況
其他的配置文件 感覺不常用,我也不知道怎麼用。。。就不提了。查看一下總體unit的情況。
systemctl 提供了子命令可以查看系統上的 unit,命令格式爲:
systemctl [command] [--type=TYPE] [--all]
command 有:
- list-units:列出當前已經啓動的 unit,如果添加 -all 選項會同時列出沒有啓動的 unit。
- list-unit-files:根據 /lib/systemd/system/ 目錄內的文件列出所有的 unit。還可以通過這個查看unit是否開機啓動
–type=TYPE:可以過濾某個類型的 unit。比如service/target/
不帶任何參數執行 systemctl 命令會列出所有已啓動的 unit:
systemctl
systemctl list-units
效果一致。
列出所有的units查看狀態
systemctl list-units --all
列出所有已啓動的 target
systemctl list-units --type=target
列出所有的unit。查看是否開機啓動
systemctl list-unit-files
附
傳統命令init,poweroff,halt,reboot都成爲systemctl的軟鏈接
關機:systemctl halt、systemctl poweroff
重啓:systemctl reboot
掛起:systemctl suspend
休眠:systemctl hibernate
休眠並掛起:systemctl hybrid-sleep
大致如此,由於個人都不太理解。因此這篇博客更多是供自己複習使用,待有了更深的認識,可能要重新修改。
參考資料太多,可能沒有一一貼全。
https://www.cnblogs.com/isme-zjh/p/11685233.html
https://blog.csdn.net/skh2015java/article/details/94012643
https://www.cnblogs.com/shijingjing07/p/9301590.html
https://www.pianshen.com/article/61511272363/
https://www.jianshu.com/p/a740255a9b69
https://blog.csdn.net/u011314255/article/details/80314003