系統(tǒng)服務(wù)
一剩檀、后臺(tái)任務(wù)
&
先說(shuō)工作任務(wù)
Ctrl+z 可以把一個(gè)前臺(tái)運(yùn)行的程序放在后臺(tái)腻惠,且停止工作谬运。
先編輯一個(gè) a.sh 的小程序
while true do echo "$(date +%s) I love her" >> /root/bin/love.txt sleep 3 done
運(yùn)行這個(gè)程序
sh a.sh
此時(shí)乙各,你會(huì)發(fā)現(xiàn)這個(gè)程序是卡在當(dāng)前的終端的爬骤,這個(gè)就是程序在前臺(tái)運(yùn)行的骡湖。 這種情況下贱纠,這個(gè)程序不終止的話,當(dāng)前終端就無(wú)法執(zhí)行別的命令了响蕴。
此時(shí)谆焊,可以按下' Ctrl+z '把這個(gè)程序放到后臺(tái),但是浦夷,這個(gè)程序會(huì)進(jìn)入 停止?fàn)顟B(tài)辖试。
jobs 命令會(huì)查看到當(dāng)前后臺(tái)的工作任務(wù)
jobs -l
fg %工作號(hào) 就是可以把后臺(tái)的工作任務(wù)調(diào)到前臺(tái)繼續(xù)運(yùn)行
bg %工作號(hào) 會(huì)讓后天處于停止?fàn)顟B(tài)的任務(wù)(進(jìn)程) 繼續(xù)運(yùn)行于后臺(tái)
使用如下方式,可以讓一個(gè)程序劈狐,在一開(kāi)始運(yùn)行時(shí)就在后臺(tái)運(yùn)行罐孝。
命令 選項(xiàng) 參數(shù) sh a.sh &
他的效果相當(dāng)于“ctrl+z和bg %工作號(hào)”兩部命令
daemon 守護(hù)進(jìn)程
計(jì)算機(jī)想要提供一些功能給用戶使用,需要一個(gè)程序肥缔,并把進(jìn)程運(yùn)行起來(lái)莲兢。之前說(shuō)過(guò),程序運(yùn)行起來(lái)就是進(jìn)程了续膳,進(jìn)程都有生命周期的改艇。
運(yùn)行 等待 休眠 結(jié)束
計(jì)算機(jī)提供的某一項(xiàng)功能需要長(zhǎng)期的運(yùn)行,就像一個(gè)網(wǎng)站坟岔,你什么時(shí)間訪問(wèn)他谒兄,都會(huì)得到響應(yīng)。這樣就需要把提供這類功能的進(jìn)程長(zhǎng)期的放在內(nèi)存中社付,不讓他結(jié)束承疲。
這類的進(jìn)程通常成為服務(wù)邻耕,那誰(shuí)來(lái)管理這些進(jìn)程呢?就是控制這些服務(wù)進(jìn)程的啟動(dòng)燕鸽、重啟赊豌、停止。
就是叫守護(hù)進(jìn)程的進(jìn)程绵咱, 在 CentOS7 中是 systemd, CentOS5/6 是 init碘饼。也可以說(shuō)服務(wù) service 通常都是以守護(hù)進(jìn)程的方式啟動(dòng)的,都是在后臺(tái)運(yùn)行的。
早期的 System V
在一開(kāi)始 那個(gè)很純種的 Unix 版本的年代下面悲伶,啟動(dòng)系統(tǒng)服務(wù)的管理方式被稱為 SysV 的 init 腳本程序的處理方式艾恼!亦即系統(tǒng)核心第一支調(diào)用的程序是 init , 然后 init 去喚起所有的系統(tǒng)所需要的服務(wù)麸锉,不論是本機(jī)服務(wù)還是網(wǎng)絡(luò)服務(wù)钠绍。
init 的管理機(jī)制有幾個(gè)特點(diǎn):
init 的管理機(jī)制有幾個(gè)特點(diǎn):
1、服務(wù)的啟動(dòng)花沉、關(guān)閉與觀察等方式:
服務(wù)啟動(dòng)腳本通通放置于 /etc/init.d/ 下柳爽,都是 bash shell script 腳本程序。
啟動(dòng):/etc/init.d/daemon start
關(guān)閉:/etc/init.d/daemon stop
重新啟動(dòng):/etc/init.d/daemon restart
查看狀態(tài):/etc/init.d/daemon status
2碱屁、服務(wù)啟動(dòng)的分類:獨(dú)立啟動(dòng)和超級(jí)守護(hù)進(jìn)程總管程序管理
3磷脯、服務(wù)的相依性問(wèn)題
假如啟動(dòng)一個(gè) HTTP 服務(wù),那他就依賴于 網(wǎng)絡(luò)服務(wù)娩脾,就是網(wǎng)絡(luò)服務(wù)必須先被啟動(dòng)赵誓。
4、執(zhí)行等級(jí)的分類
init 是開(kāi)機(jī)后核心主動(dòng)調(diào)用的柿赊, 然后 init 可以根據(jù)使用者自訂的執(zhí)行等級(jí) (runlevel) 來(lái)喚醒不同的服務(wù)俩功,以進(jìn)入不同的操作界面。
Linux 提供 7 個(gè)等級(jí)(0-6)
比較重要的:
0 關(guān)機(jī)
1 單用戶模式(root)
3 帶網(wǎng)絡(luò)服務(wù)的多用戶純文本模式
5 圖形界面
6 重啟
- 使用命令 init 級(jí)別的數(shù)字 可以進(jìn)入相應(yīng)的運(yùn)行級(jí)別
CentOS7當(dāng)前的 systemd
從 CentOS 7.x 以后碰声,Red Hat 系列的 distribution(發(fā)行版本) 放棄沿用多年的 System V 開(kāi)機(jī)啟動(dòng)服務(wù)的流程诡蜓,就是前面提到的 init 啟動(dòng)腳本的方法, 改用 systemd 這個(gè)啟動(dòng)服務(wù)管理機(jī)制胰挑。
systemd 的優(yōu)點(diǎn)
-
并行啟動(dòng)服務(wù)
舊的 init 啟動(dòng)腳本是一項(xiàng)一項(xiàng)任務(wù)依序啟動(dòng)的模式蔓罚,因此沒(méi)有依賴關(guān)系的服務(wù)也是得要一個(gè)一個(gè)的啟動(dòng)的。
目前我們的硬件主機(jī)系統(tǒng)與操作系統(tǒng)幾乎都支持多核心架構(gòu)了,所以應(yīng)該支持并行啟動(dòng)洽腺。systemd 就是可以讓所有的服務(wù)同時(shí)啟動(dòng)脚粟。
-
請(qǐng)求得到立刻回復(fù)
systemd 由于常駐內(nèi)存,因此任何要求 (on-demand) 都可以立即處理后續(xù)的 daemon 啟動(dòng)的任務(wù)蘸朋。
-
服務(wù)相依性的自我檢查
例如,你部署了 FTP 服務(wù)扣唱,并且明確配置了它要依賴于 network (網(wǎng)絡(luò)) 服務(wù),但是你的 network 服務(wù)并沒(méi)有啟動(dòng)藕坯,此時(shí)团南,你要啟動(dòng) FTP 服務(wù),systemd 會(huì)幫你啟動(dòng) network 服務(wù)炼彪。
-
依 daemon 功能分類
systemd 將服務(wù)單位 (unit) 區(qū)分為 service, socket, target, path, snapshot, timer 等多種不同的類型(type)吐根, 方便系統(tǒng)管理員分類與記憶。
-
向下相容舊有的 init 服務(wù)腳本
基本上辐马, systemd 是可以相容于 init 的啟動(dòng)腳本的拷橘,因此,舊的 init 啟動(dòng)腳本也能夠通過(guò) systemd 來(lái)管理喜爷,只是更進(jìn)階的 systemd 功能就沒(méi)有辦法支持了冗疮。
-
多個(gè) daemons 集合成為一個(gè)群組 target
systemd 的配置文件放置目錄
systemd 將過(guò)去所謂的 daemon 執(zhí)行腳本通通稱為一個(gè)服務(wù)單位 (unit),而每種服務(wù)單位依據(jù)功能來(lái)區(qū)分時(shí)檩帐,就分類為不同的類型 (type)术幔。
配置文件都放在下面的路徑中
- /usr/lib/systemd/system/
每個(gè)服務(wù)最主要的啟動(dòng)腳本設(shè)置,有點(diǎn)類似以前的 /etc/init.d 下面的文件湃密;
- /run/systemd/system/
系統(tǒng)執(zhí)行過(guò)程中所產(chǎn)生的服務(wù)腳本诅挑,這些腳本的優(yōu)先序要比 /usr/lib/systemd/system/ 高!
- /etc/systemd/system/
管理員依據(jù)主機(jī)系統(tǒng)的需求所創(chuàng)建的執(zhí)行腳本泛源,其實(shí)這個(gè)目錄有點(diǎn)像以前 /etc/rc.d/rc5.d/Sxx 之類的功能拔妥!執(zhí)行優(yōu)先序又比 /run/systemd/system/ 高!
而實(shí)際執(zhí)行的 systemd 啟動(dòng)腳本配置文件达箍, 其實(shí)都是放置在 /usr/lib/systemd/system/ 下面毒嫡。
因此如果你想要修改某個(gè)服務(wù)啟動(dòng)的設(shè)置,應(yīng)該要去 /usr/lib/systemd/system/ 下面修改才對(duì)幻梯!
systemd 的 unit 類型分類說(shuō)明
一個(gè)服務(wù)執(zhí)行的腳本就成為一個(gè) unit (服務(wù)單位)
通過(guò)擴(kuò)展名區(qū)分 unit 的類型
- .service 一般服務(wù)類型 (service unit)
主要是系統(tǒng)服務(wù)兜畸,包括服務(wù)器本身所需要的本機(jī)服務(wù)以及網(wǎng)絡(luò)服務(wù)都是!比較經(jīng)常被使用到的服務(wù)大多是這種類型碘梢! 所以咬摇,這也是最常見(jiàn)的類型了!
- .socket 內(nèi)部程序數(shù)據(jù)交換的 socket 服務(wù) (socket unit)
主要是 IPC (Inter-process communication) 的傳輸訊息 socket file 功能。 一般用于本機(jī)服務(wù)比較多煞躬,例如我們的圖形界面很多的軟件都是通過(guò) socket 來(lái)進(jìn)行本機(jī)程序數(shù)據(jù)交換的行為肛鹏。
- .target 執(zhí)行環(huán)境類型 (target unit)
其實(shí)是一群 unit 的集合,例如 multi-user.target 其實(shí)就是一堆服務(wù)的集合~也就是說(shuō)恩沛, 選擇執(zhí)行 multi-user.target 就是執(zhí)行一堆其他 .service 或/及 .socket 之類的服務(wù)在扰!
- .mount .automount 文件系統(tǒng)掛載相關(guān)的服務(wù) (automount unit / mount unit)
例如來(lái)自網(wǎng)絡(luò)的自動(dòng)掛載、NFS 文件系統(tǒng)掛載等與文件系統(tǒng)相關(guān)性較高的程序管理雷客。
- .path 偵測(cè)特定文件或目錄類型 (path unit)
某些服務(wù)需要偵測(cè)某些特定的目錄來(lái)提供隊(duì)列服務(wù)芒珠,例如最常見(jiàn)的打印服務(wù),就是通過(guò)偵測(cè)打印隊(duì)列目錄來(lái)啟動(dòng)打印功能搅裙! 這時(shí)就得要 .path 的服務(wù)類型支持了皱卓!
- .timer 循環(huán)執(zhí)行的服務(wù) (timer unit)
這個(gè)東西有點(diǎn)類似 anacrontab 喔裹芝!不過(guò)是由 systemd 主動(dòng)提供的,比 anacrontab 更加有彈性娜汁!
通過(guò) systemctl 管理服務(wù)
systemd 啟動(dòng)服務(wù)的機(jī)制嫂易,主要是通過(guò) systemctl 的命令完成所有的操作。
命令語(yǔ)法: systemctl [command] [unit]
command 主要有:
status :查看這個(gè) unit 的狀態(tài)掐禁!
start :立刻啟動(dòng)
stop :立刻停止
restart :先執(zhí)行 stop 再執(zhí)行 start 的意思
enable :設(shè)置下次開(kāi)機(jī)時(shí)怜械,啟動(dòng)后面接的 unit
disable :設(shè)置下次開(kāi)機(jī)時(shí),不啟動(dòng)后面接的 unit
reload :不關(guān)閉后面接的 unit 的情況下傅事,重新載入配置文件缕允,讓設(shè)置生效
示例操作
查看 atd.server 的狀態(tài)
[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...
關(guān)鍵的是第二行和第三行
第二行中的 enabled 表示下次開(kāi)機(jī),會(huì)自動(dòng)啟動(dòng)此服務(wù)享完。
第三行中的 loaded(running) 表示目前是運(yùn)行狀態(tài)灼芭。
關(guān)閉 atd.server, 在看其狀態(tài)
[root@shark ~]# systemctl stop atd.service
[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) 表示目前沒(méi)有運(yùn)行
關(guān)于 Active 的狀態(tài):
- active (running):正在運(yùn)行
- active (exited):僅執(zhí)行一次就正常結(jié)束的服務(wù),目前并沒(méi)有任何程序在系統(tǒng)中執(zhí)行般又。 舉例來(lái)說(shuō)彼绷,開(kāi)機(jī)或者是掛載時(shí)才會(huì)進(jìn)行一次的 quotaon 功能,就是這種模式\钋ā(無(wú)須常駐內(nèi)存)寄悯。
- active (waiting):正在執(zhí)行當(dāng)中,不過(guò)還再等待其他的事件才能繼續(xù)處理堕义。舉例來(lái)說(shuō)猜旬,打印的隊(duì)列相關(guān)服務(wù)就是這種狀態(tài)!
- inactive:這個(gè)服務(wù)目前沒(méi)有運(yùn)行的意思倦卖。
關(guān)于daemon (服務(wù)) 的默認(rèn)狀態(tài) - enabled:這個(gè) daemon 將在開(kāi)機(jī)時(shí)被執(zhí)行
- disabled:這個(gè) daemon 在開(kāi)機(jī)時(shí)不會(huì)被執(zhí)行
- mask:這個(gè) daemon 無(wú)論如何都無(wú)法被啟動(dòng)洒擦!因?yàn)橐呀?jīng)被強(qiáng)制注銷 (非刪除)∨绿牛可通過(guò) systemctl unmask 方式改回原本狀態(tài)
- static:這個(gè) daemon 不可以自己?jiǎn)?dòng) (enable 不可)熟嫩,不過(guò)可能會(huì)被其他的 enabled 的服務(wù)來(lái)喚醒 (相依屬性的服務(wù))
強(qiáng)制注銷
被注銷的服務(wù)是服務(wù)再次啟動(dòng)的
命令
systemctl status cups
輸出
● cups.service
Loaded: masked (/dev/null; bad) # 注意這里
Active: inactive (dead)
取消注銷
systemctl unmask cups.service
添加自定義服務(wù)到 systemd
systemctl 配置文件的設(shè)置項(xiàng)目簡(jiǎn)介
先看一個(gè) sshd.service 的實(shí)例
[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
配置文件中大概能夠?qū)⒄麄€(gè)設(shè)置分為三個(gè)部份,就是:
- [Unit]
unit 本身的說(shuō)明褐捻,以及與其他相依 daemon 的設(shè)置掸茅,包括在什么服務(wù)之后才啟動(dòng)此 unit 之類的設(shè)置值;
- [Service], [Socket], [Timer], [Mount], [Path]...
不同的 unit type 就得要使用相對(duì)應(yīng)的設(shè)置項(xiàng)目柠逞。
我們拿的是 sshd.service 來(lái)當(dāng)范本昧狮,所以這邊就使用 [Service] 來(lái)設(shè)置。 這個(gè)項(xiàng)目?jī)?nèi)主要在規(guī)范服務(wù)啟動(dòng)的腳本板壮、環(huán)境配置文件文件名逗鸣、重新啟動(dòng)的方式等等。
- [Install]
這個(gè)項(xiàng)目就是將此 unit 安裝到哪個(gè) target 里面去的意思!
示例
下面的示例是慕购,寫(xiě)一個(gè) shell 腳本聊疲,之后讓 systemd 去管理這個(gè)腳本程序茬底。
- 編寫(xiě)腳本和環(huán)境文件
在自己用戶的家目錄下的 bin 目錄下編寫(xiě)腳本 love.sh , 寫(xiě)入下面的內(nèi)容
while true
do
echo "$(date +%s) I love her" >> /root/bin/love.txt
echo "$(date +%s) ${name} love her" >> /root/bin/love.txt
sleep 3
done
腳本的意思是
每 3 秒鐘向 /root/bin/love.txt 文件中寫(xiě)上兩句話
注意 ${name} 是一個(gè)配置文件的中變量
編寫(xiě)這個(gè)腳本程序的配置文件 /root/bin/love.conf
- 作為服務(wù)添加到 systemd
編譯 /etc/ 文件沪悲,添加如下內(nèi)容
[Unit]
Description=Love server daemon
[Service]
Type=simple
ExecStart=/bin/bash /root/bin/love.sh
ExecStop=/bin/kill -9 $(ps -ef |grep '[a].sh' |awk '{print $2}')
EnvironmentFile=/root/bin/love.conf
[Install]
WantedBy=multi-user.target
- 控制服務(wù)啟停
systemctl daemon-reload // 程序加載 讓 systemd 加載 love.service 服務(wù)
systemctl start love.service // 啟動(dòng)
systemctl status love.service // 查看狀態(tài)
驗(yàn)證程序的執(zhí)行結(jié)果, 持續(xù)觀察 /root/bin/love.txt 文件,看有沒(méi)有被持續(xù)寫(xiě)入內(nèi)容阱表,并且觀察變量有沒(méi)有生效殿如。
tail -f /root/bin/love.txt
輸出
1564567167 I love her
1564567167 shark-user love her
1564567170 I love her
1564567170 shark-user love her
1564567173 I love her
1564567173 shark-user love her
1564567176 I love her
1564567176 shark-user love her
1564567179 I love her
1564567179 shark-user love her