1、systemd
(1)CentOS 7 使用systemd替換了SysV。Systemd目的是要取代一直在使用的init系統,兼容SysV和LSB的啟動腳本,負責在系統啟動或運行時,激活系統資源、服務器進程和其它進程。
(2)systemd的新特性:
系統引導是實現服務并行啟動 按需啟動守護進程 自動化管理各服務間的依賴關系 同時采用sockets式與D-Bus總線式激活服務 系統狀態快照與系統恢復
2、unit
(1)systemd引進了unit區塊,記錄啟動順序與依賴關系。unit表示不同類型的systemd對象,通過配置文件進行表示和配置;文件中主要包含了系統服務、監聽sockets、保存的系統快照已經其它與init相關的信息。這些配置文件主要保存在以下目錄中:
/usr/lib/systemd/system/目錄:此目錄保存的是各個服務最主要的啟動腳本設置文件,類似于centos7之前的/etc/init.d/目錄。 /run/systemd/system/目錄:系統執行過程中所產生的服務腳本,優先于上面目錄運行。 /etc/systemd/system/目錄:管理員建立的執行腳本,類似于/etc/rc.d/rcN.d/S* (N:0-6)的功能,比上面的目錄優先運行(最優先)。
(2)unit的常見類型:(systemctl -t help 命令查看unit類型)
service:文件擴展名為.service,用于定義系統服務 target:文件擴展名為.target,用于模擬實現“運行級別” snapshot:文件擴展名為.snapshot,用于管理系統快照 device:文件擴展名為.device,用于定義內核識別的設備 mount:文件擴展名為.mount,用于定義文件系統掛載點 automount:文件擴展名為.automunt,用于定義文件系統的自動掛載點 swap:文件擴展名為.swap,用于標識swap設備 path:文件擴展名為.path,用于定義文件系統中的一個文件或目錄使用,常用于當文件系統變化時,延遲激活服務,如:spool目錄 [root@localhost system]# ls /var/spool abrt abrt-upload anacron at cron cups lpd mail plymouth postfix
(3)unit關鍵特性:
基于socket 的激活機制:socket 與服務程序分離 基于d-bus 的激活機制: 基于device 的激活機制: 基于path 的激活機制: 系統快照:保存各unit 的當前狀態信息于持久存儲設備中 向后兼容sysv init 腳本 不兼容: systemctl 命令固定不變,不可擴展 非由systemd 啟動的服務,systemctl無法與之通信
3、systemctl命令用法
systemctl - Control the systemd system and service manager systemctl [OPTIONS...] COMMAND [NAME...] 注意:以下name.service表示某個具體服務
啟動:
systemctl start name.service
停止:
systemctl stop name.service
重啟:
systemctl restart name.service
查看狀態:
systemctl status name.service
條件式重啟:已啟動才重啟,否則不做操作:
systemctl try-restart name.service
重載或重新啟動服務:先加載,再啟動:
systemctl reload-or-restart name.service
重載或條件式重啟服務:
systemctl reload-or-try-restart name.service
禁止自動和手動啟動服務:
systemctl mask name.service
取消禁止:
systemctl unmask name.service
查看某服務當前激活與否的狀態:
systemctl is-active name.service
查看所有已經激活的服務:
systemctl list-units --type(-t) service
查看所有的服務(包括激活和未激活):
systemctl list-units --type service -all(-a) loaded:Unit 配置文件已處理 active(running): 一次或多次持續處理的運行 active(exited): 成功完成一次性的配置 active(waiting): 運行中,等待一個事件 inactive: 不運行 enabled: 開機啟動 disabled: 開機不啟動 static: 開機不啟動,但可被另一個啟用的服務激活
設定某服務開機啟動:
systemctl enable name.service (相當于chkconfig name on)
設定某服務開機禁止啟動:
systemctl disable name.service(相當于chkconfig name off)
查看所有服務的開機自啟狀態:
systemctl list-unit-files --type service(相當于chkconfig --list)
列出該服務在哪些運行級別下啟用和禁用:
ls /etc/systemd/system/*.wants/name.service(列出的為啟用)
查看服務是否開機自啟:
systemctl is-enabled name.service
查看服務的依賴關系:
systemctl list-dependencies name.service
殺掉進程:
systemctl kill 進程號(名)
4、其他常用命令
切換至緊急救援模式:
systemctl rescue
切換至emergency 模式:
systemctl emergency
其它常用命令:
傳統命令init ,poweroff ,halt ,reboot 都成為systemctl 的軟鏈接 關機:systemctl halt 、systemctl poweroff 重啟:systemctl reboot 掛起:systemctl suspend 休眠: :systemctl hibernate 休眠并掛起:systemctl hybrid-sleep
5、target units:運行級別
相關配置文件:.target
ls /usr/lib/systemd/system/*.target:列出所有target unit。 systemctl list-unit-files --type target --all:顯示所有target服務
(1)運行級別:
0 ==> runlevel0.target, poweroff.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.target 6 ==> runlevel6.target, reboot.target
(2)查看某級別的依賴性:
systemctl list-dependencies name.target
(3)級別切換:
systemctl isolate name.target
注意:只有/lib/systemd/system/name.target 文件中AllowIsolate=yes 才能切換(修改文件需執行systemctl daemon-reload 才能生效)
(4)查看默認運行級別:
systemctl get-default
(5)修改默認級別:
systemctl set-default name.target (實質是創建了個指向/usr/lib/systemd/system/目錄的軟連接)
6、service unit文件格式
/etc/systemd/system/:系統管理員和用戶使用 /usr/lib/systemd/system/:發行版打包者使用
我們先看看service unit的文件內容,以httpd.service為例。
[root@localhost system]# cat httpd.service [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} # We want systemd to give httpd some time to finish gracefully, but still want # it to kill httpd after TimeoutStopSec if something went wrong during the # graceful stop. Normally, Systemd sends SIGTERM signal right after the # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target 說明: 以“#”開頭的行后面的內容表示注釋 相關布爾值,1 、yes 、on 、true 都是開啟,0 、no 、off、false 都是關閉。 時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等請顯示說明
service unit file通常由三部分組成:
[Unit]:定義與unit類型無關的通用選項,用于描述unit類型的描述信息、unit行為及依賴關系等 [Service]:與特定類型相關的專用選項;此處為service類型 [Install]:定義由“systemctl enable”已經“systemctl disable”命令在實現服務啟用、禁用時用到的一些選項
Unit段的常用選項:
Description:描述信息 After:定義unit的啟動次序,表示當前unit應該晚于那些unit啟動,其功能與Before相反 Requires:依賴到的其它units,強依賴,被依賴的units無法激活是,當前的unit也無法激活 wants:依賴到的其它units,弱依賴 Conflicts:定義units間的沖突關系
Service段的常用選項:
Type:定義影響ExecStart及相關參數的功能的unit進程啟動類型 simple :默認值,這個daemon 主要由ExecStart 接的指令串來啟動,啟動后常駐于內存中 forking :由ExecStart 啟動的程序透過spawns 延伸出其他子程序來作為此daemon 的主要服務。原生父程序在啟動結束后就會終止 oneshot :與simple 類似,不過這個程序在工作完畢后就結束了,不會常駐在內存中 dbus :與simple 類似,但這個daemon 必須要在取得一個D-Bus的名稱后,才會繼續運作. 因此通常也要同時設定BusNname= 才行 notify :在啟動完成后會發送一個通知消息。還需要配合NotifyAccess 讓來讓 Systemd 接收消息 idle :與simple 類似,要執行這個daemon 必須要所有的工作都順利執行完畢后才會執行。這類的daemon 通常是開機到最后才執行即可的服務 EnvironmentFile :環境配置文件 ExecStart :指明啟動unit 要運行命令或腳本的絕對路徑 ExecStartPre:ExecStart 前運行 ExecStartPost:ExecStart 后運行 ExecStop :指明停止unit 要運行的命令或腳本 Restart :當設定Restart=1 時,則當次daemon 服務意外終止后,會再次自動啟動此服務
Install段的常用選項:
Alias :別名,可使用systemctl command Alias.service RequiredBy :被哪些units 所依賴,強依賴 WantedBy :被哪些units 所依賴,弱依賴 Also :安裝本服務的時候還要安裝別的相關服務 注意:對于新創建的unit 文件,或者修改了的unit 文件,要通知systemd 重載此配置文件,可用命令: systemctl daemon-reload
7、示例:創建一個備份服務
(1)創建一個腳本,用于被創建的服務調用
[root@localhost system]# cat /testdir/bak.sh #!/bin/bash # 備份/etc/目錄 tar -Jcvf /testdir/etc-`date +%F`.tar.xz /etc/ &> dev/null
(2)給bak.sh腳本添加執行權限
[root@localhost system]# chmod u+x /testdir/bak.sh
(3)創建bak.service服務
[root@localhost system]# pwd /etc/systemd/system (創建服務的文件存放位置) [root@localhost system]# cat bak.service [Unit] Description=backup my etc Requires=atd.service [Service] Type=simple ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now" #使用/bin/bash命令來執行bak.sh腳本,因此第2步可以省略 [Install] WantedBy=multi-user.target
(4)啟用服務
[root@localhost system]# systemctl daemon-reload [root@localhost system]# systemctl start bak.service
(5)驗證
原創文章,作者:pao,如若轉載,請注明出處:http://www.www58058.com/48172