Linux學習筆記(十三):系統服務
- daemon & service
- systemd
- systemctl指令
- 管理單一服務(service unit)
- 查看系統上所有的服務
- 管理不同的操作環境(target unit)
- 分析服務間的依賴性
- 與daemon運行相關的目錄
- 網路服務與埠
- systemctl針對service型別的組態檔
- systemctl組態檔目錄
- systemctl組態檔引數
- 舉例:創建備份服務
- systemctl針對timer型別的組態檔
daemon & service
A daemon, or system service, is a background process usually started during the boot sequence. Daemons typically run independent of users, waiting for events to occur and providing services in response. source1
A “Service” could refer to either a Daemon or a Service. A daemon is a subset of services that always run in memory waiting to service a request. A non-daemon service generally is handled by xinetd (eXtended InterNET services daemon). xinetd listens for the request, then starts the required service to handle the request. After the request has been serviced the service is then stopped again. source2
Typical non-daemon services: rsync vsftpd
Typical daemonized services: MySQL Apache
然而對于一般的Linux使用者來說,并不需要區分daemon與service,
systemd
systemd即為system daemon,是linux下的一種init軟體,開發目標是提供更優秀的框架以表示系統服務間的依賴關系,并依此實作系統初始化時服務的并行啟動,同時達到降低Shell的系統開銷的效果,最終代替常用的System V與BSD風格init程式,source3
從CentOS 7.x以后,紅帽系列的distribution放棄了沿用多年的System V開機啟動服務的流程,改用systemd的啟動服務管理機制,systemd包括常駐記憶體的systemd服務與systemctl指令,與System V的init啟動腳本相比,其好處在于:
- 平行處理所有服務,加速開機流程;
- 一經要求就回應的on-demand啟動方式;
- 自動檢查并處理服務依賴性;
- 根據功能將服務單位(unit)劃分為service, socket, target, path, snapshot, timer等不同型別,方便管理;
- 將多個daemon集合為一個target群組,可以同時執行;
- 向下兼容舊的init服務腳本,
systemd的組態檔目錄
systemd將以前的daemon執行腳本通稱為一個服務單位(unit),每種服務單位依據功能來區分時,可以分為不同的型別(type),基本的型別有系統服務、資料監聽與交換的套接字服務(socket)、存盤系統狀態的快照(snapshot)、提供不同類似執行等級分類的操作環境(target),等等,不同型別的服務組態檔都放在如下目錄中:
/usr/lib/systemd/system/:每個服務最主要的啟動腳本設定,類似以前/etc/init.d中的檔案;/run/systemd/system/:系統執行程序中所產生的服務腳本,其優先級比/usr/lib/systemd/system高;/etc/systemd/system:管理員依據主機系統的需求建立的執行腳本,類似以前的/etc/rc.d/rc5.d/Sxx,執行的優先級比/run/systemd/system高,
因此,決定系統開機是否會執行哪些服務其實要看/etc/systemd/system中的設定,但實際中該目錄下都是一些鏈接檔案,實際執行的腳本都在/usr/lib/systemd/system目錄下,
systemd的unit型別分類說明
通過檔案擴展名可以區分/usr/lib/systemd/system/目錄下不同服務的型別,
| 擴展名 | 主要服務功能 |
|---|---|
| .service | 一般服務型別,主要是系統服務,包括服務器本身所需要的本地服務以及網路服務,也是最常見的型別 |
| .socket | 內部程式資料交換的套接字服務,可以看作是為不同行程間提供雙向通信功能(Inter-process communication)的端點 |
| .target | 執行環境型別,其實是一群服務單元的集合,執行.target就是執行集合中包含的一堆.service和.socket等服務 |
| .mount .automount | 檔案系統掛載相關的服務,例如來自網路的自動掛載、NFS檔案系統掛載等等 |
| .path | 偵測特定檔案或目錄型別,比如列印服務就需要偵測列印佇列目錄來啟動列印功能 |
| .timer | 回圈執行的服務,功能與anacrontab類似,但是更加靈活 |
systemctl指令
相比System V的service, chkconfig, setup, init指令,systemd僅依賴systemctl一個指令來管理服務,
管理單一服務(service unit)
通過systemctl管理單一服務的啟動、開機啟動的指令格式為systemctl [command] [unit],其中,command主要有:
- start:立刻啟動服務單元;
- stop:立刻停止服務單元;
- restart:立刻重啟服務單元;
- reload:在不停止服務單元的情況下,重新加載組態檔使設定生效;
- enable:設定服務單元開機自啟動;
- disable:設定服務單元開始時不會被啟動;
- status:查看服務單元目前的狀態;
- is-active:查看服務單元目前是否在運行中;
- is-enable:查看服務單元是否設定了開機自啟動,
需要注意的是,不要使用kill指令關閉服務,否則systemctl會無法繼續監控該服務,systemctl status的輸出中,常見的服務狀態有:
- active (running):有一個或多個程式正在系統中執行;
- active (exited):僅執行一次就正常結束的服務,目前并沒有任何程式在系統中執行;
- active (waiting):正在執行中,但是在等待其他的事件才能繼續處理;
- inactive:當前服務沒有處于運行狀態;
- enabled:該服務已設定開機啟動;
- disabled:該服務未設定開機啟動;
- static:該服務不能自己啟動,但可以被其他服務喚醒;
- mask:該服務無論如何都不能被啟動,因為已經被強制注銷,但是可以通過
systemctl unmask指令改回原來的狀態,
查看系統上所有的服務
通過systemctl查看系統上所有服務的指令格式為systemctl [command] [--type=TYPE] [--all],其中,command有
- list-units:根據unit列出目前啟動的服務單元,若加上
--all才會列出未啟動的服務; - list-unit-files:根據
/usr/lib/systemd/system/內的檔案,將所有檔案串列說明,
--type=TYPE即是指服務單元的型別,包括service, socket, target等等,
管理不同的操作環境(target unit)
列出與操作界面有關的target的指令為systemctl list-units --type=target --all,CentOS 7中與操作界面相關性較高的主要有
- graphical.target:文字加上圖形界面,包含了multi-user.target專案;
- multi-user.target:純文本模式;
- rescue.target:在無法使用root登錄的情況下,systemd在開機時會多加一個額外的暫時系統,可以用于取得root權限來維護系統;
- emergency.target:緊急處理系統的錯誤,在rescue.target無法使用時可以嘗試;
- shutdown.target:關機的流程;
- getty.target:可以設定需要幾個tty,
查看與修改操作界面相關的target的指令格式為systemctl [command] [unit.target],其中,command包括
- get-default:顯示目前的target資訊;
- set-default:設定target為默認的操作模式;
- isolate:在不關機的情況下,切換到后面接的操作模式,
systemctl也提供了其他指令來切換操作模式,
[root@study ~]$ systemctl get-default
graphical.target
[root@study ~]$ systemctl set-default multi-user.target
[root@study ~]$ systemctl get-default
multi-user.target
[root@study ~]$ systemctl isolate multi-user.target
[root@study ~]$ systemctl isolate graphical.target
[root@study ~]$ systemctl poweroff # 系統關機
[root@study ~]$ systemctl reboot # 重啟
[root@study ~]$ systemctl suspend # 暫停
[root@study ~]$ systemctl hibernate # 休眠
[root@study ~]$ systemctl rescue # 強制進入救援模式
[root@study ~]$ systemctl emergency # 進入緊急救援模式
其中,暫停模式(suspend)會將系統的狀態資料保存到記憶體中,然后關閉大部分系統硬體,但并未關機;休眠模式(hibernate)則是將系統狀態保存到硬碟當中,然后將計算機關機,暫停模式喚醒的速度通常比休眠模式更快,
分析服務間的依賴性
通過systemctl分析服務之間依賴性的指令為systemctl list-dependencies [unit] [--reverse],其中--reverse表示反向追蹤誰在使用該服務單元,
與daemon運行相關的目錄
除了之前提到的systemd組態檔目錄以外,與系統服務運行有關的目錄還包括:
/usr/lib/systemd/system//run/systemd/system//etc/systemd/system//etc/sysconfig/*:幾乎所有服務都會將初始化的一些選項設定寫入該目錄下;/var/lib/:一些會產生資料的服務會將資料寫入到該目錄下;/run/:該目錄下存放了很多系統服務的暫存檔案,包括lock file和PID file,
網路服務與埠
/etc/services中設定了網路服務、對應的網路協議(tcp、udp)與埠,一般不建議通過該檔案來直接修改服務的埠號,使用netstat指令也可以查看打開的埠,如果有不需要開啟的網路服務,可以使用systemctl stop指令關閉服務(及其使用的埠),
systemctl針對service型別的組態檔
systemctl組態檔目錄
以vsftpd服務為例,其對應的組態檔包括:
/usr/lib/systemd/system/vsftpd.service:官方釋出的預設組態檔,建議不要修改;/etc/systemd/system/vsftpd.service.d/custom.conf:該檔案中的設定會被累加到/usr/lib/systemd/system/vsftpd.service檔案中;/etc/systemd/system/vsftpd.service.wants/*:依賴檔案的鏈接,wants表示在vsftpd.service啟動之后才能啟動的其它服務;/etc/systemd/system/vsftpd.service.requires/*:依賴檔案的鏈接,requires表示在啟動vsftpd.service之前需要先啟動的其它服務,
systemctl組態檔引數
以sshd服務為例,其組態檔sshd.service的內容如下:
[root@study ~]$ cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
注意到,該組態檔內容被分為了三個部分:
- [Unit]:服務單元本身的說明,以及與其他服務的依賴關系;
- [Service], [Socket], [Mount], …:不同的服務單元型別就要使用對應的專案設定,這里sshd.service當然就是用[Service]設定,該部分內容主要規定服務啟動的腳本、環境、組態檔名、重啟的方式等等;
- [Install]:表示將該服務單元安裝到哪一個target里面,
此外,有幾個重要的設定規則如下:
- 組態檔中的設定專案是可以重復的,比如我可以設定多個After引數,但是最后一個After的設定會取代(覆寫)前面所有After引數的設定值;
- 如果有的引數的設定方式是布林值,可以用1, yes, true, on表示啟動,用0, no, false, off表示關閉;
- 空白行、以#或;開頭的行都表示注釋,
[Unit]部分常見的設定引數如下:
| [Unit]引數 | 意義 |
|---|---|
| Description | 使用systemctl list-units時會輸出的簡單說明 |
| Documentation | 提供進一步的檔案查詢功能,可以是如下內容: Documentation=http://www…, Documentation=man:sshd(8), 或Documentation=file:/etc/ssh/sshd_config |
| After | 說明此Unit在哪些服務啟動之后才會啟動,僅說明服務的啟動順序,并不是實際上的強制設定(與Requires不同) |
| Before | 與After剛好相反,但也僅僅是說明啟動順序 |
| Requires | 明確定義此Unit必須在哪些服務啟動后才能啟動,如果后面接的服務沒有啟動,該Unit就不會被啟動 |
| Wants | 與Requires剛好相反,定義最好在該Unit啟動之后再啟動的其他服務,如果后面接的服務沒有啟動,不會影響到該Unit本身 |
| Conflicts | 沖突的服務,即不能與該Unit同時運行的其它服務 |
[Service]部分常見的設定引數如下:
| [Service]引數 | 意義 |
|---|---|
| Type | 該服務啟動的方式,會影響到ExecStart,可以分為: simple,默認值,郵ExecStart啟動,且啟動后常駐記憶體; forking,由ExecStart啟動的程式通過spawns延伸出其他子程式來作為此服務的主要服務,其原生的父程式在啟動結束后就會終止運行;oneshot,與simple類似,但該程式在作業完成后就會結束,不會常駐在記憶體中; dbus,與simple類似,但此服務必須在取得一個D-Bus名稱后才會繼續運行;idle,與simple類似,但是必須要等到所有作業都順利執行完畢后該服務才會執行,通常是開機程序中最后執行的服務, |
| EnvironmentFile | 指定啟動腳本的環境組態檔 |
| ExecStart | 實際執行此服務的指令或腳本,與systemctl start有關 |
| ExecStop | 關閉此服務時所執行的指令或腳本,與systemctl stop有關 |
| ExecReload | 多載組態檔,與systemctl reload有關 |
| Restart | 設定為1時,當此服務終止后,會自動再次啟動該服務 |
| RemainAfterExit | 設定為1時,當此服務所屬的所有程式都終止以后,此服務會自動嘗試啟動 |
| TimeoutSec | 此服務出現無法正常啟動或關閉時,在進入強制結束狀態前需要等待的時間 |
| KillMode | 可以是以下三種模式中的一種: process,此服務終止時,只會停止主要的程式(ExecStart中的指令); control-group,由該服務產生的其他control-group程式也都會被關閉; none,沒有程式會被關閉 |
| RestartSec | 此服務被關閉后需要重啟時,重啟前需要等待的時間,預設為100ms |
[Install]部分常見的設定引數如下:
| [Install]引數 | 意義 |
|---|---|
| WantedBy | 后面接的大部分是*.target unit,表示該服務附掛在哪一個tagrget unit底下,一般是multi-user.target |
| Also | 當目前該服務被設定為開機自啟(enabled)時,后面接的服務也會被enable,通常是具有依賴性的其它服務 |
| Alias | 設定別名 |
舉例:創建備份服務
假設我們要創建一個備份服務,
# 創建備份腳本
[root@study ~]$ vim /backups/backup.sh
#! /bin/bash
source="/etc /home /root /var/lib /var/spool/{cron.at.mail}"
target="/backups/backup-system-$(data +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
[root@study ~]$ chmod a+x /backups/backup.sh
# 創建服務組態檔
[root@study ~]$ vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service # 因為用到了at指令
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"
[Install]
WantedBy=multi-user.target
[root@study ~]$ systemctl daemon-reload # 多載服務組態檔
[root@study ~]$ systemctl start backup.service # 運行一次備份服務
[root@study ~]$ systemctl status backup.service
backup.service - backup my server
Loaded: loaded (/etc/systemd/system/backup.service; disabled)
Acitve: inactive (dead) # 備份服務執行完就停止了,并不會常駐記憶體
systemctl針對timer型別的組態檔
假設上面創建的backup.service服務需要定期執行,可以使用systemd的timer來處理,要使用timer功能,必須具備以下條件:
- 系統的timer.target必須已經啟動;
- backup.service服務已經創建;
- backup.timer的時間啟動服務已創建,且設定為enabled,
.timer檔案的引數設定
可以在/etc/systemd/system/下建立timer檔案,其基本引數包括:
- OnActiveSec:當timer.target啟動多久后才執行此服務;
- OnBootSec:當開機多久后才執行此服務;
- OnStartupSec:當systemd第一次啟動之后多久才執行此服務;
- OnUnitActiveSec:此timer組態檔管理的unit服務在最后一次啟動后,隔多久后再執行一次;
- OnUnitInactiveSec:此timer組態檔管理的unit服務在最后一次停止后,隔多久后再執行一次;
- OnCalendar:按實際時間(非回圈時間)來啟動服務;
- Unit:一般無需設定,默認為對應的服務名,即name.service對應name.timer;
- Persistent:使用OnCalendar時,是否要持續進行,設定為yes即能滿足類似anacron的功能,
OnCalendar時間格式
基本的時間格式為“星期幾 YYYY-MM-DD HH:MM:SS”,例如Thu 2020-12-25 14:30:00,
也可以使用時間間隔,包括毫秒ms、秒s、分鐘m、小時h、天數d、周數w、月month(s)、年y,比如,隔5天12小時30分鐘可以表示為30m 12h 5d,或者30min 12hours 5day,
還可以使用口語化的時間表達方式,包括now、today、tomorrow、hourly、daily、weekly、monthly、+3h10m、2020-12-30等,
假設我們需要前面創建的備份服務backup.service每周日凌晨2點運行一次,創建對應的timer檔案如下,
[root@study ~]$ vim /etc/systemd/system/backup.timer
[Unit]
Description=backup my server timer
[Timer]
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=multi-user.target
[root@study ~]$ systemctl daemon-reload # 多載服務組態檔
[root@study ~]$ systemctl enable backup.timer
[root@study ~]$ systemctl start backup.timer
[root@study ~]$ systemctl show backup.timer
NextElapseUSecRealtime=50y 11month 3w 6d 23h 59min ## 下一次執行需要等待的時間,與1970-01-01 00:00:00比較
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243946.html
標籤:其他
