13.系統服務

一、後臺任務

https://www.jianshu.com/p/954550c2b528

&

Ctrl+z 可以把一個前臺運行的程序放在後臺。

這樣的話進程是停止的狀態。

命令   選項   參數    &
sh   a.sh      &

nohub &

nohup    sh    a.sh   &

daemon 守護進程

計算機想要提供一些功能給用戶使用,需要一個程序,並把進程運行起來。

之前說過,程序運行起來就是進程了,進程都有生命週期的。

運行 等待 休眠 結束

計算機提供的某一項功能需要長期的運行,就像一個網站,你什麼時間訪問他,都會得到響應。

這樣就需要把提供這類功能的進程長期的放在內存中,不讓他結束。

這類的進程通常成爲服務,那誰來管理這些進程呢?就是控制這些服務進程的啓動、重啓、停止。

就是叫守護進程的進程, 在 CentOS7 中是 systemd, CentOS5/6 是 init

也可以說服務 service 通常都是以守護進程的方式啓動的,都是在後臺運行的。

早期的 System V

在一開始 那個很純種的 Unix 版本的年代下面,啓動系統服務的管理方式被稱爲 SysV 的 init 腳本程序的處理方式!亦即系統核心第一支調用的程序是 init , 然後 init 去喚起所有的系統所需要的服務,不論是本機服務還是網絡服務。

init 的管理機制有幾個特點:

  1. 服務的啓動、關閉與觀察等方式:
    服務啓動腳本通通放置於 /etc/init.d/ 下,都是 bash shell script 腳本程序。

    • 啓動:/etc/init.d/daemon start
    • 關閉:/etc/init.d/daemon stop
    • 重新啓動:/etc/init.d/daemon restart
    • 查看狀態:/etc/init.d/daemon status
  2. 服務啓動的分類:獨立啓動和超級守護進程總管程序管理

  1. 服務的相依性問題
    假如啓動一個 HTTP 服務,那他就依賴於 網絡服務,就是網絡服務必須先被啓動。

  2. 執行等級的分類
    init 是開機後核心主動調用的, 然後 init 可以根據使用者自訂的執行等級 (runlevel) 來喚醒不同的服務,以進入不同的操作界面。
    Linux 提供 7 個等級(0-6)
    比較重要的:

  • 0 關機
  • 1 單用戶模式(root)
  • 3 帶網絡服務的多用戶純文本模式
  • 5 圖形界面
  • 6 重啓

使用命令 init 級別的數字 可以進入相應的運行級別

  1. 指定級別默認啓動的服務

可以使用如下方式設置某個服務在每個運行級別是否是默認啓動狀態

chkconfig  --list   // 查看所有的服務運行級級別的狀態 
chkconfig   --level  3  mysqld  off  // 設置 mysqld 服務在運行級別 3 默認不啓動
chkconfig  --level   3 5  mysqld  on   // 設置 mysqld  服務在運行級別 3 和 5 中默認啓動

雖然 CentOS 7 已經不使用 init 來管理服務了,不過因爲考慮到某些腳本沒有辦法直接塞入 systemd 的處理,因此這些腳本還是被保留下來, 所以,我們在這裏還是稍微介紹了一下。

CentOS7當前的 systemd

從 CentOS 7.x 以後,Red Hat 系列的 distribution(發行版本) 放棄沿用多年的 System V 開機啓動服務的流程,就是前面提到的 init 啓動腳本的方法, 改用 systemd 這個啓動服務管理機制。

systemd 的優點

  • 並行啓動服務

舊的 init 啓動腳本是一項一項任務依序啓動的模式,因此沒有依賴關係的服務也是得要一個一個的啓動的。
目前我們的硬件主機系統與操作系統幾乎都支持多核心架構了,所以應該支持並行啓動。systemd 就是可以讓所有的服務同時啓動。

  • 請求得到立刻回覆

systemd 由於常駐內存,因此任何要求 (on-demand) 都可以立即處理後續的 daemon 啓動的任務.

  • 服務相依性的自我檢查

例如,你部署了 FTP 服務,並且明確配置了它要依賴於 network (網絡) 服務,但是你的 network 服務並沒有啓動,此時,你要啓動 FTP 服務,systemd 會幫你啓動 network 服務。

  • 依 daemon 功能分類

systemd 將服務單位 (unit) 區分爲 service, socket, target, path, snapshot, timer 等多種不同的類型(type), 方便系統管理員分類與記憶。

  • 向下相容舊有的 init 服務腳本

基本上, systemd 是可以相容於 init 的啓動腳本的,因此,舊的 init 啓動腳本也能夠通過 systemd 來管理,只是更進階的 systemd 功能就沒有辦法支持了。

  • 多個 daemons 集合成爲一個羣組 target

systemd 的配置文件放置目錄

systemd 將過去所謂的 daemon 執行腳本通通稱爲一個服務單位 (unit),而每種服務單位依據功能來區分時,就分類爲不同的類型 (type)。

配置文件都放在下面的路徑中

  • /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/ 高!

而實際執行的 systemd 啓動腳本配置文件, 其實都是放置在 /usr/lib/systemd/system/ 下面。
因此如果你想要修改某個服務啓動的設置,應該要去 /usr/lib/systemd/system/ 下面修改纔對!

systemd 的 unit 類型分類說明

一個服務執行的腳本就成爲一個 unit (服務單位)

通過擴展名區分 unit 的類型

  • .service 一般服務類型 (service unit)

主要是系統服務,包括服務器本身所需要的本機服務以及網絡服務都是!比較經常被使用到的服務大多是這種類型! 所以,這也是最常見的類型了!

  • .socket 內部程序數據交換的 socket 服務 (socket unit)

主要是 IPC (Inter-process communication) 的傳輸訊息 socket file 功能。 一般用於本機服務比較多,例如我們的圖形界面很多的軟件都是通過 socket 來進行本機程序數據交換的行爲。

  • .target 執行環境類型 (target unit)

其實是一羣 unit 的集合,例如 multi-user.target 其實就是一堆服務的集合~也就是說, 選擇執行 multi-user.target 就是執行一堆其他 .service 或/及 .socket 之類的服務!

  • .mount .automount 文件系統掛載相關的服務 (automount unit / mount unit)

例如來自網絡的自動掛載、NFS 文件系統掛載等與文件系統相關性較高的程序管理。

  • .path 偵測特定文件或目錄類型 (path unit)

某些服務需要偵測某些特定的目錄來提供隊列服務,例如最常見的打印服務,就是通過偵測打印隊列目錄來啓動打印功能! 這時就得要 .path 的服務類型支持了!

  • .timer 循環執行的服務 (timer unit)

這個東西有點類似 anacrontab 喔!不過是由 systemd 主動提供的,比 anacrontab 更加有彈性!


通過 systemctl 管理服務

systemd 啓動服務的機制,主要是通過 systemctl 的命令完成所有的操作。

命令語法: systemctl [command] [unit]

command 主要有:

status    :查看這個 unit 的狀態!
start     :立刻啓動
stop      :立刻停止
restart   :先執行 stop 再執行 start 的意思

enable    :設置下次開機時,啓動後面接的 unit 
disable   :設置下次開機時,不啓動後面接的 unit

reload    :不關閉後面接的 unit 的情況下,重新載入配置文件,讓設置生效

示例操作

查看 atd.server 的狀態

[root@shark ~]# systemctl status atd.service
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2019-07-29 22:41:37 CST; 46min ago
 Main PID: 1162 (atd)
   CGroup: /system.slice/atd.service
           └─1162 /usr/sbin/atd -f

7月 29 22:41:37 shark.sharkyun.com systemd[1]: Started Job spooling tools.
7月 29 22:41:37 shark.sharkyun.com systemd[1]: Starting Job spooling tools...

關鍵的是第二行和第三行
第二行中的 enabled 表示下次開機,會自動啓動此服務。
第三行中的 loaded(running) 表示目前是運行狀態。

先關閉 atd.server, 在看其狀態

[root@shark ~]# systemctl status atd.service
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 一 2019-07-29 23:31:09 CST; 1s ago
  Process: 1162 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
 Main PID: 1162 (code=exited, status=0/SUCCESS)

7月 29 22:41:37 shark.sharkyun.com systemd[1]: Started Job spooling tools.
7月 29 22:41:37 shark.sharkyun.com systemd[1]: Starting Job spooling tools...
7月 29 23:31:09 shark.sharkyun.com systemd[1]: Stopping Job spooling tools...
7月 29 23:31:09 shark.sharkyun.com systemd[1]: Stopped Job spooling tools.

第三行中的 inactive (dead) 表示目前沒有運行

關於 Active 的狀態:

  • active (running):正在運行
  • active (exited):僅執行一次就正常結束的服務,目前並沒有任何程序在系統中執行。 舉例來說,開機或者是掛載時纔會進行一次的 quotaon 功能,就是這種模式!(無須常駐內存)。
  • active (waiting):正在執行當中,不過還再等待其他的事件才能繼續處理。舉例來說,打印的隊列相關服務就是這種狀態!
  • inactive:這個服務目前沒有運行的意思。

關於daemon (服務) 的默認狀態

  • enabled:這個 daemon 將在開機時被執行
  • disabled:這個 daemon 在開機時不會被執行
  • mask:這個 daemon 無論如何都無法被啓動!因爲已經被強制註銷 (非刪除)。可通過 systemctl unmask 方式改回原本狀態
  • static:這個 daemon 不可以自己啓動 (enable 不可),不過可能會被其他的 enabled 的服務來喚醒 (相依屬性的服務)

強制註銷

被註銷的服務是服務再次啓動的
別擔心,可以使用 unmask 取消註銷

命令
systemctl status cups

輸出
● cups.service
   Loaded: masked (/dev/null; bad)  # 注意這裏
   Active: inactive (dead)

取消註銷

 systemctl unmask cups.service

通過 systemctl 管理不同的操作環境 (target unit)

列出跟運行級別有關的 target

 systemctl list-units --type=target --all

幾個比較重要的 target unit

  • graphical.target

就是文字加上圖形界面,這個項目已經包含了下面的 multi-user.target 項目!

  • multi-user.target

純文本模式!

  • rescue.target

救援模式!在無法使用 root 登陸的情況下,systemd 在開機時會多加一個額外的暫時系統,與你原本的系統無關。這時你可以取得 root 的權限來維護你的系統。 但是這是額外系統,因此可能需要動到 chroot 的方式來取得你原有的系統!自修

  • emergency.target

緊急處理系統的錯誤,還是需要使用 root 登陸的情況,在無法使用 rescue.target 時,可以嘗試使用這種模式!

  • shutdown.target

就是關機的流程。

  • getty.target

可以設置你需要幾個 tty 之類的,如果想要降低 tty 的數量,可以修改這個東西的配置文件!

查看當前模式和修改默認模式

命令語法:

systemctl [command] [unit.target]
選項與參數:
command:
    get-default :查看默認的 target 
    set-default :設置後面接的 target 成爲默認的模式
    isolate     :切換到後面接的模式

示例

[root@shark ~]# systemctl get-default
graphical.target
[root@shark ~]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
[root@shark ~]# systemctl get-default
multi-user.target

在不重新開機的情況下,將目前的操作環境改爲純文本模式,關掉圖形界面

systemctl isolate multi-user.target

系統服務和端口

head  -50   /etc/services

添加自定義服務到 systemd

systemctl 配置文件的設置項目簡介

先看一個 sshd.service 的實例

[root@shark ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
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]

unit 本身的說明,以及與其他相依 daemon 的設置,包括在什麼服務之後才啓動此 unit 之類的設置值;

  • [Service], [Socket], [Timer], [Mount], [Path]..

不同的 unit type 就得要使用相對應的設置項目。
我們拿的是 sshd.service 來當範本,所以這邊就使用 [Service] 來設置。 這個項目內主要在規範服務啓動的腳本、環境配置文件文件名、重新啓動的方式等等。

  • [Install]

這個項目就是將此 unit 安裝到哪個 target 裏面去的意思!

參考資料

設置程序

[root@shark ~]# vim /backups/backup.sh
#!/bin/bash

source="/etc  /root  /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log

[root@shark ~]# chmod a+x /backups/backup.sh

添加服務


[root@study ~]# vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service

[Service]
Type=simple
ExecStart=/bin/bash -c " echo /backups/backup.sh | at now"

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start backup.service
systemctl status backup.service
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章