一、后臺(tái)任務(wù)
http://www.reibang.com/p/954550c2b528
&
先說工作任務(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)前終端就無法執(zhí)行別的命令了挡爵。
此時(shí)竖般,可以按下 Ctrl+z
把這個(gè)程序放到后臺(tái),但是茶鹃,這個(gè)程序會(huì)進(jìn)入 停止?fàn)顟B(tài)涣雕。
jobs
命令會(huì)查看到當(dāng)前后臺(tái)的工作任務(wù)
jobs
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)
bg %1
使用如下方式,可以讓一個(gè)程序闭翩,在一開始運(yùn)行時(shí)就在后臺(tái)運(yùn)行挣郭。
命令 選項(xiàng) 參數(shù) &
sh a.sh &
daemon 守護(hù)進(jìn)程
計(jì)算機(jī)想要提供一些功能給用戶使用,需要一個(gè)程序疗韵,并把進(jìn)程運(yùn)行起來兑障。
之前說過,程序運(yùn)行起來就是進(jìn)程了蕉汪,進(jìn)程都有生命周期的流译。
運(yùn)行 等待 休眠 結(jié)束
計(jì)算機(jī)提供的某一項(xiàng)功能需要長(zhǎng)期的運(yùn)行,就像一個(gè)網(wǎng)站肤无,你什么時(shí)間訪問他先蒋,都會(huì)得到響應(yīng)。
這樣就需要把提供這類功能的進(jìn)程長(zhǎng)期的放在內(nèi)存中宛渐,不讓他結(jié)束竞漾。
這類的進(jìn)程通常成為服務(wù)眯搭,那誰來管理這些進(jìn)程呢?就是控制這些服務(wù)進(jìn)程的啟動(dòng)业岁、重啟搓茬、停止锚沸。
就是叫守護(hù)進(jìn)程的進(jìn)程折联, 在 CentOS7 中是 systemd
, CentOS5/6 是 init
棕叫。
也可以說服務(wù) service 通常都是以守護(hù)進(jìn)程的方式啟動(dòng)的,都是在后臺(tái)運(yùn)行的。
早期的 System V
在一開始 那個(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):
-
服務(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
服務(wù)啟動(dòng)的分類:獨(dú)立啟動(dòng)和超級(jí)守護(hù)進(jìn)程總管程序管理
服務(wù)的相依性問題
假如啟動(dòng)一個(gè) HTTP 服務(wù),那他就依賴于 網(wǎng)絡(luò)服務(wù)骡楼,就是網(wǎng)絡(luò)服務(wù)必須先被啟動(dòng)熔号。執(zhí)行等級(jí)的分類
init 是開機(jī)后核心主動(dòng)調(diào)用的, 然后 init 可以根據(jù)使用者自訂的執(zhí)行等級(jí) (runlevel) 來喚醒不同的服務(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í)別
- 指定級(jí)別默認(rèn)啟動(dòng)的服務(wù)
可以使用如下方式設(shè)置某個(gè)服務(wù)在每個(gè)運(yùn)行級(jí)別是否是默認(rèn)啟動(dòng)狀態(tài)
chkconfig --list // 查看所有的服務(wù)運(yùn)行級(jí)級(jí)別的狀態(tài)
chkconfig --level 3 mysqld off // 設(shè)置 mysqld 服務(wù)在運(yùn)行級(jí)別 3 默認(rèn)不啟動(dòng)
chkconfig --level 3 --level 5 mysqld on // 設(shè)置 mysqld 服務(wù)在運(yùn)行級(jí)別 3 和 5 中默認(rèn)啟動(dòng)
雖然 CentOS 7 已經(jīng)不使用 init 來管理服務(wù)了,不過因?yàn)榭紤]到某些腳本沒有辦法直接塞入 systemd 的處理吃嘿,因此這些腳本還是被保留下來祠乃, 所以,我們?cè)谶@里還是稍微介紹了一下兑燥。
CentOS7當(dāng)前的 systemd
從 CentOS 7.x 以后,Red Hat 系列的 distribution(發(fā)行版本) 放棄沿用多年的 System V 開機(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)的模式蚓胸,因此沒有依賴關(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ù)并沒有啟動(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)腳本也能夠通過 systemd 來管理入宦,只是更進(jìn)階的 systemd 功能就沒有辦法支持了哺徊。
-
多個(gè) daemons 集合成為一個(gè)群組 target
systemd 的配置文件放置目錄
systemd 將過去所謂的 daemon 執(zhí)行腳本通通稱為一個(gè)服務(wù)單位 (unit),而每種服務(wù)單位依據(jù)功能來區(qū)分時(shí)乾闰,就分類為不同的類型 (type)落追。
配置文件都放在下面的路徑中
-
/usr/lib/systemd/system/
每個(gè)服務(wù)最主要的啟動(dòng)腳本設(shè)置,有點(diǎn)類似以前的 /etc/init.d 下面的文件汹忠;
-
/run/systemd/system/
系統(tǒng)執(zhí)行過程中所產(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 類型分類說明
一個(gè)服務(wù)執(zhí)行的腳本就成為一個(gè) unit (服務(wù)單位)
通過擴(kuò)展名區(qū)分 unit 的類型
-
.service 一般服務(wù)類型 (service unit)
主要是系統(tǒng)服務(wù)花履,包括服務(wù)器本身所需要的本機(jī)服務(wù)以及網(wǎng)絡(luò)服務(wù)都是!比較經(jīng)常被使用到的服務(wù)大多是這種類型挚赊! 所以诡壁,這也是最常見的類型了!
-
.socket 內(nèi)部程序數(shù)據(jù)交換的 socket 服務(wù) (socket unit)
主要是 IPC (Inter-process communication) 的傳輸訊息 socket file 功能。 一般用于本機(jī)服務(wù)比較多荠割,例如我們的圖形界面很多的軟件都是通過 socket 來進(jìn)行本機(jī)程序數(shù)據(jù)交換的行為妹卿。
-
.target 執(zhí)行環(huán)境類型 (target unit)
其實(shí)是一群 unit 的集合,例如
multi-user.target
其實(shí)就是一堆服務(wù)的集合~也就是說蔑鹦, 選擇執(zhí)行multi-user.target
就是執(zhí)行一堆其他.service
或/及.socket
之類的服務(wù)夺克!
-
.mount .automount 文件系統(tǒng)掛載相關(guān)的服務(wù) (automount unit / mount unit)
例如來自網(wǎng)絡(luò)的自動(dòng)掛載、NFS 文件系統(tǒng)掛載等與文件系統(tǒng)相關(guān)性較高的程序管理嚎朽。
-
.path 偵測(cè)特定文件或目錄類型 (path unit)
某些服務(wù)需要偵測(cè)某些特定的目錄來提供隊(duì)列服務(wù)铺纽,例如最常見的打印服務(wù),就是通過偵測(cè)打印隊(duì)列目錄來啟動(dòng)打印功能哟忍! 這時(shí)就得要
.path
的服務(wù)類型支持了狡门!
-
.timer 循環(huán)執(zhí)行的服務(wù) (timer unit)
這個(gè)東西有點(diǎn)類似
anacrontab
喔陷寝!不過是由systemd
主動(dòng)提供的,比anacrontab
更加有彈性融撞!
通過 systemctl 管理服務(wù)
systemd 啟動(dòng)服務(wù)的機(jī)制盼铁,主要是通過 systemctl
的命令完成所有的操作。
命令語法: systemctl [command] [unit]
command 主要有:
status :查看這個(gè) unit 的狀態(tài)尝偎!
start :立刻啟動(dòng)
stop :立刻停止
restart :先執(zhí)行 stop 再執(zhí)行 start 的意思
enable :設(shè)置下次開機(jī)時(shí)饶火,啟動(dòng)后面接的 unit
disable :設(shè)置下次開機(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
表示下次開機(jī),會(huì)自動(dòng)啟動(dòng)此服務(wù)抖僵。
第三行中的loaded(running)
表示目前是運(yùn)行狀態(tài)鲤看。
先關(guān)閉 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: 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)
表示目前沒有運(yùn)行
關(guān)于 Active 的狀態(tài):
- active (running):正在運(yùn)行
- active (exited):僅執(zhí)行一次就正常結(jié)束的服務(wù),目前并沒有任何程序在系統(tǒng)中執(zhí)行耍群。 舉例來說义桂,開機(jī)或者是掛載時(shí)才會(huì)進(jìn)行一次的 quotaon 功能,就是這種模式5腹浮(無須常駐內(nèi)存)慷吊。
- active (waiting):正在執(zhí)行當(dāng)中,不過還再等待其他的事件才能繼續(xù)處理曹抬。舉例來說溉瓶,打印的隊(duì)列相關(guān)服務(wù)就是這種狀態(tài)!
- inactive:這個(gè)服務(wù)目前沒有運(yùn)行的意思谤民。
關(guān)于daemon (服務(wù)) 的默認(rèn)狀態(tài)
- enabled:這個(gè) daemon 將在開機(jī)時(shí)被執(zhí)行
- disabled:這個(gè) daemon 在開機(jī)時(shí)不會(huì)被執(zhí)行
- mask:這個(gè) daemon 無論如何都無法被啟動(dòng)堰酿!因?yàn)橐呀?jīng)被強(qiáng)制注銷 (非刪除)≌抛悖可通過 systemctl unmask 方式改回原本狀態(tài)
- static:這個(gè) daemon 不可以自己?jiǎn)?dòng) (enable 不可)触创,不過可能會(huì)被其他的 enabled 的服務(wù)來喚醒 (相依屬性的服務(wù))
強(qiáng)制注銷
被注銷的服務(wù)是服務(wù)再次啟動(dòng)的
別擔(dān)心,可以使用unmask
取消注銷
命令
systemctl status cups
輸出
● cups.service
Loaded: masked (/dev/null; bad) # 注意這里
Active: inactive (dead)
取消注銷
systemctl unmask cups.service
通過 systemctl 管理不同的操作環(huán)境 (target unit)
列出跟運(yùn)行級(jí)別有關(guān)的 target
systemctl list-units --type=target --all
幾個(gè)比較重要的 target unit
-
graphical.target
就是文字加上圖形界面为牍,這個(gè)項(xiàng)目已經(jīng)包含了下面的 multi-user.target 項(xiàng)目嗅榕!
-
multi-user.target
純文本模式!
-
rescue.target
救援模式吵聪!在無法使用 root 登陸的情況下,systemd 在開機(jī)時(shí)會(huì)多加一個(gè)額外的暫時(shí)系統(tǒng)兼雄,與你原本的系統(tǒng)無關(guān)吟逝。這時(shí)你可以取得 root 的權(quán)限來維護(hù)你的系統(tǒng)。 但是這是額外系統(tǒng)赦肋,因此可能需要?jiǎng)拥?chroot 的方式來取得你原有的系統(tǒng)块攒!自修
-
emergency.target
緊急處理系統(tǒng)的錯(cuò)誤励稳,還是需要使用 root 登陸的情況,在無法使用 rescue.target 時(shí)囱井,可以嘗試使用這種模式驹尼!
-
shutdown.target
就是關(guān)機(jī)的流程。
-
getty.target
可以設(shè)置你需要幾個(gè) tty 之類的庞呕,如果想要降低 tty 的數(shù)量新翎,可以修改這個(gè)東西的配置文件!
查看當(dāng)前模式和修改默認(rèn)模式
命令語法:
systemctl [command] [unit.target]
選項(xiàng)與參數(shù):
command:
get-default :查看默認(rèn)的 target
set-default :設(shè)置后面接的 target 成為默認(rèn)的模式
isolate :切換到后面接的模式
示例
# 獲取到當(dāng)前默認(rèn)的啟動(dòng)模式
[root@shark ~]# systemctl get-default
graphical.target # 圖形模式
# 設(shè)置默認(rèn)啟動(dòng)模式為 字符模式(就是黑和白)
[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.
# 再次檢查當(dāng)前默認(rèn)的啟動(dòng)模式
[root@shark ~]# systemctl get-default
multi-user.target
在不重新開機(jī)的情況下住练,將目前的操作環(huán)境改為純文本模式地啰,關(guān)掉圖形界面
systemctl isolate multi-user.target
系統(tǒng)服務(wù)和端口
head -50 /etc/services
添加自定義服務(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 本身的說明讲逛,以及與其他相依 daemon 的設(shè)置亏吝,包括在什么服務(wù)之后才啟動(dòng)此 unit 之類的設(shè)置值;
-
[Service], [Socket], [Timer], [Mount], [Path]..
不同的 unit type 就得要使用相對(duì)應(yīng)的設(shè)置項(xiàng)目盏混。
我們拿的是 sshd.service 來當(dāng)范本蔚鸥,所以這邊就使用 [Service] 來設(shè)置。 這個(gè)項(xiàng)目?jī)?nèi)主要在規(guī)范服務(wù)啟動(dòng)的腳本许赃、環(huán)境配置文件文件名止喷、重新啟動(dòng)的方式等等。
-
[Install]
這個(gè)項(xiàng)目就是將此 unit 安裝到哪個(gè) target 里面去的意思图焰!
示例
下面的示例是启盛,寫一個(gè) shell 腳本,之后讓 systemd 去管理這個(gè)腳本程序技羔。
編寫腳本和環(huán)境文件
在自己用戶的家目錄下的 bin
目錄下編寫腳本 love.sh
, 寫入下面的內(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
文件中寫上兩句話
注意${name}
是一個(gè)配置文件的中變量
編寫這個(gè)腳本程序的配置文件 /root/bin/love.conf
name=shark-user
作為服務(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
文件,看有沒有被持續(xù)寫入內(nè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