Linux 守護程式

Sol·wang發表於2021-06-06

什麼是守護程式

脫離控制終端的,執行於後端的程式,由系統管理的,按計劃自動啟動/停止/重啟,用以執行特定的任務。

為什麼要有守護程式?

在某些需求場景下,我們希望某項系統任務能夠按計劃按預期,始終/自動 保持正常執行狀態,以便於持續提供服務功能。

一個小栗子,假如,我們部署一個站點服務,當伺服器作業系統自動重啟後,我們希望部署的站點服務也能夠自動啟動,無需人工去啟動。

再舉一個小栗子,假如,以上部署的站點服務,遇到執行錯誤異常後能夠自動重啟,以保持正常執行狀態,無需人工干預。

再舉一個小栗子,假如,某些服務,我們希望它,在每天的凌晨自動啟動並執行,在每天的凌晨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 

 

其它守護程式方式持續更新...

相關文章