什麼是守護程式
脫離控制終端的,執行於後端的程式,由系統管理的,按計劃自動啟動/停止/重啟,用以執行特定的任務。
為什麼要有守護程式?
在某些需求場景下,我們希望某項系統任務能夠按計劃按預期,始終/自動 保持正常執行狀態,以便於持續提供服務功能。
一個小栗子,假如,我們部署一個站點服務,當伺服器作業系統自動重啟後,我們希望部署的站點服務也能夠自動啟動,無需人工去啟動。
再舉一個小栗子,假如,以上部署的站點服務,遇到執行錯誤異常後能夠自動重啟,以保持正常執行狀態,無需人工干預。
再舉一個小栗子,假如,某些服務,我們希望它,在每天的凌晨自動啟動並執行,在每天的凌晨5點自動關閉,無需人工干預。
脫離終端的後臺程式
不依賴於任何終端,不因連線終端的變化而對程式的執行產生關聯或影響,與當前環境隔離開來,讓程式本身能夠自動進入後臺執行。以便於讓管理員可以在終端繼續處理其它工作。
init daemon 方式
當系統啟動後,這時候,我們希望能夠自動處理一些事情,那麼Linux中提供了 init.d,它會在系統啟動後自動執行。
我們寫一個命令指令碼,用於啟動對應的應用程式。那麼這串指令碼就可以以檔案的方式,建立於 /etc/init.d 目錄下。當被啟動後的系統自動執行後,完成自動啟動。
一般Linux安裝的應用程式會提供此檔案,其中包含 啟動/停止/狀態 等的命令 或應用本身的配置項,把此檔案複製到 /etc/init.d/ 目錄下,加入自啟動,當系統的init執行後,對應的應用程式指令碼會被執行並啟動服務。
以mysql為例:
提供的檔案在安裝目錄 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,常用操作命令:
啟動一個服務 | 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