什么是守護進程
脫離控制終端的,運行於后端的進程,由系統管理的,按計划自動啟動/停止/重啟,用以執行特定的任務。
為什么要有守護進程?
在某些需求場景下,我們希望某項系統任務能夠按計划按預期,始終/自動 保持正常運行狀態,以便於持續提供服務功能。
一個小栗子,假如,我們部署一個站點服務,當服務器操作系統自動重啟后,我們希望部署的站點服務也能夠自動啟動,無需人工去啟動。
再舉一個小栗子,假如,以上部署的站點服務,遇到運行錯誤異常后能夠自動重啟,以保持正常運行狀態,無需人工干預。
再舉一個小栗子,假如,某些服務,我們希望它,在每天的凌晨自動啟動並運行,在每天的凌晨5點自動關閉,無需人工干預。
脫離終端的后台進程
不依賴於任何終端,不因連接終端的變化而對進程的運行產生關聯或影響,與當前環境隔離開來,讓程序本身能夠自動進入后台運行。以便於讓管理員可以在終端繼續處理其它工作。
init daemon 方式
簡介
當系統啟動后,這時候,我們希望能夠自動處理一些事情,那么Linux中提供了 init.d,它會在系統啟動后自動運行。
我們寫一個命令腳本,用於啟動對應的應用程序。那么這串腳本就可以以文件的方式,創建於 /etc/init.d 目錄下。當被啟動后的系統自動運行后,完成自動啟動。
一般Linux安裝的應用程序會提供此文件,其中包含 啟動/停止/狀態 等的命令 或應用本身的配置項,把此文件復制到 /etc/init.d/ 目錄下,加入自啟動,當系統的init運行后,對應的應用程序腳本會被執行並啟動服務。
案例
以 MySql8 為例,官方提供的文件在安裝目錄 mysql/support-files/mysql.server,把 mysql.server 復制到 /etc/init.d/ 目錄下。
加入系統自啟動:
1 chkconfig --add {filename} 2 chkconfig {filename} on
可以通過以下命令手動管理服務狀態:
- 啟動:service {filename} start 等同於 /etc/init.d/{filename} start
- 停止:service {filename} stop 等同於 /etc/init.d/{filename} stop
- 重啟:service {filename} restart 等同於 /etc/init.d/{filename} restart
- 查看:service {filename} status 等同於 /etc/init.d/{filename} status
system daemon 方式
簡介
通常稱為 systemd,以文件形式,以 .service 為后綴,創建於 /usr/lib/systemd/system/ 目錄下。
文件中的配置項包含:服務描述、啟動順序、啟動用戶角色、啟動類型、啟動 / 停止 / 重啟、重啟模式、重啟間隔、超時設置 等
(可參考同目錄下其它文件的配置格式)
常用操作命令
啟動一個服務 | systemctl start {filename}.service |
重啟一個服務 | systemctl restart {filename}.service |
重載一個服務配置 | systemctl reload {filename}.service |
重載所有修改過的配置 | systemctl daemon-reload |
關閉一個服務 | systemctl stop {filename}.service |
顯示服務狀態 | systemctl status {filename}.service |
設置開機啟動 | systemctl enable {filename}.service |
關閉開機啟動 | systemctl disable {filename}.service |
啟動失敗的服務列表 | systemctl --failed |
查看服務活動詳細列表 | systemctl list-units |
列出服務配置文件狀態 | systemctl list-unit-files |
查看服務是否開機啟動 | systemctl is-enabled {filename}.service |
查看服務是否運行狀態 | systemctl is-active {filename}.service |
查看服務是否啟動失敗 | systemctl is-failed {filename}.service |
終止一個服務及子進程 | systemctl kill {filename}.service |
遠程操作某個服務狀態 | systemctl -H {username}@{IP} {active} {filename}.service |
為此,可以利用以上設置對一個服務的管理。
crond 定時任務
簡介
周期性的運行或等待處理某些任務的一個Linux進程。特定時間/定時/間隔 運行指定的應用程序。相當於Windows的計划任務。
Linux crond 命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。
Linux crond 工作主要分為以下兩類:
- 系統需要的,自動執行的;如:備份系統數據、清理緩存
- 個人需要的,配置執行的;如:用戶指定運行的應用程序
配置
以下闡述 [個人配置執行] 的定時任務。
用 cat 命令打開 /etc/crontab,我們來看下配置文件的結構如下:
1 SHELL=/bin/bash 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 MAILTO=root 4 5 # For details see man 4 crontabs 6 7 # Example of job definition: 8 # .---------------- minute (0 - 59) 9 # | .------------- hour (0 - 23) 10 # | | .---------- day of month (1 - 31) 11 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 12 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 13 # | | | | | 14 # * * * * * user-name command to be executed
從 行7 [Example of job definition:] 以下的描述得知:
有 分 / 時 / 日 / 月 / 周 的時間配置項,並指定運行的用戶和應用程序命令。
[ * ]:代表該位置單位內的所有值,如:月份中的 1 - 31
[ , ]:代表指定單位多值的間隔符,如:分鍾中的 3,8,13,25 四個值
[ - ]:代表指定單位中的范圍取值,如:日中的 1 - 10 號
[ / ]:代表指定單位中設定的間隔值,如:小時中的 */2 , 斜杠后表示每2小時
案例
配置案例1:每分鍾都執行
* * * * * /bin/appname
配置案例2:每個月的 1-5 號的 [7:50] 執行
50 7 1-5 * * /bin/appname
配置案例3:每月的1號和15號凌晨執行
0 0 1,15 * * /bin/appname
配置案例4:每月每隔10天 的6:30分 執行一次,也就是1、11、21、31號
30 6 */10 * * /bin/appname
配置案例5:每周工作日的凌晨3點鍾執行
00 03 * * 1-5 /bin/appname