2020年11月4日 星期三

Linux rpm build (3) .service 開機可自動執行

參考來源:

Linux systemd 系統服務管理基礎教學與範例

如何在Linux上將任意應用程式變成開機可自動執行


Systemd 基本服務管理

在 Systemd 中每一個系統服務就稱為一個服務單位(unit),而服務單位又可以區分為 service、socket、target、path、snapshot、timer 等多種不同的類型(type),

我們可以從設定檔的附檔名來判斷該服務單位所屬的類型,最常見的就是以 .service 結尾的系統服務,大部分的伺服器都是屬於這種。


如果要管理 Systemd 中的各種服務,可以使用 systemctl 這個指令,配合各種操作指令來進行各種操作。


systemctl 操作指令 服務名稱.service

若要啟動系統服務,可以使用 start 操作指令,例如啟動 accusys.service:

當我們在指定服務名稱時,可以將結尾的 .service 省略,這樣可以少打一些字,例如:


# 套用Systemd Unit的設定檔變更

在新增、或是修改Systemd Unit的設定檔後,要在終端機執行以下指令才會重新載入:

sudo systemctl daemon-reload


# 啟動 service

sudo systemctl start accusys


# 顯示 service 服務狀態

systemctl status accusys


# 停止 service 服務

sudo systemctl stop accusys


# 設定開機自動啟動 service

sudo systemctl enable accusy


# 取消開機自動啟動 service

sudo systemctl disable accusys


# 檢查 service 服務是否正在運行

systemctl is-active accusys


# 檢查 service 服務是否有設定開機自動啟動

systemctl is-enabled accusys


# 檢查 service 服務是否啟動失敗

systemctl is-failed accusys


列出 Systemd 所有服務

若想要列出所有已啟動的服務,可以使用 list-units 操作指令:


# 列出所有已啟動的服務

systemctl list-units


# 查看服務內部設定檔

systemctl cat accusys.service


---------------------------------------------------------------->

[Unit]

Description=Accusys GUI GS

After=network.target

 

[Service]

# User=user

# Group=group

# WorkingDirectory=/path/to/folder

ExecStart=/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/scsi/accusys/RGX_GS_3.6.8/DTRGuiSrv_64

Restart=always

RestartSec=10s


# Environment="VARIABLE_1=VALUE_1" "VARIABLE_2=VALUE_2"

# Environment="VARIABLE_3=VALUE_3" "VARIABLE_4=VALUE_4"

 

[Install]

WantedBy=multi-user.target

<----------------------------------------------------------------


[Unit]區塊中,我們撰寫了兩個項目。

Description用來設定這個Systemd Service Unit設定檔案的描述,可以讓管理員在日後查看時還能想起這個Systemd Service Unit的目的是什麼。

另一個After項目可以用來指定一個Systemd Target Unit,可以確保目前正在設定的這個Unit,會在Systemd Target Unit運行完後再運行。

如果是用來提供Web服務的應用程式,那麼通常就必須要在作業系統環境的網路功能被啟用之後才能夠正常啟動,

所以After項目設定為network.target可以確保該程式在第一次執行時候就順利啟動。


[Service]區塊中有五個使用井字號#註解掉的項目,這些先不要管它,稍候會再提到。

ExecStart項目可以用來設定當這個Systemd Service Unit項目啟動時要執行的應用程式(需使用完整絕對路徑),並且如果需要的話,

可以利用空白字元來分隔多個不同的引數。若是這個程式需要搭配shell的命令列功能(例如變數、管線等)來執行,

那就使用如以下的方式先執行shell之後,再運行shell的命令吧!


ExecStart=/bin/bash -c 'shell命令'

Restart項目可以設定ExecStart所執行的程式要在什麼樣的情況被關閉時,以相同的指令再重新執行一次。有效的設定值如下:


no:不重啟。(預設值)

always:不管什麼原因都會重啟。

on-success:只在成功運行結束後(也就是行程回傳的Exit Status為0的時候)才進行重啟。(這蠻少用)

on-failure:在運行失敗後(行程回傳的Exit Status非為0、被使用Kill信號強制關閉、逾時或是餵狗沒反應時)才進行重啟。

on-abnormal:在意外地運行失敗後(被使用Kill信號強制關閉、逾時或是餵狗沒反應時)才進行重啟。

on-abort:被使用Kill信號強制關閉時才進行重啟。

on-watchdog:餵狗沒反應時才進行重啟。

上述提到的「逾時」,可以在[Service]區塊中用TimeoutSec項目來設定程式在執行多久後算是逾時,一般我們是用不到這個機制啦!

而「餵狗」則是使用Systemd提供的看門狗(Watchdog)機制,使程式在固定時間內(可以在[Service]區塊中用WatchdogSec項目來設定),

必須主動呼叫Systemd函式庫的sd_notify函數,以利Systemd判斷該程式是否還是正常運作的狀態,一般我們也是用不到這個機制的啦!


至於RestartSec這個項目,就是設定程式在被關閉後,到下次自動重啟的間隔時間,預設是100ms(毫秒)。

最後的[Install]區塊中,只有WantedBy這一個設定項目,它可以用來指定一個Systemd Target Unit,讓目前正在設定的這個Unit,

會在運行該Systemd Target Unit時,也跟著被運行。

接著來談談被註解掉的項目,首先是User和Group這兩個項目,它們可以分別用來設定要運行ExecStart項目所指定的程式時所使用的使用者名稱和群組名稱。

另外如果程式的運行必須仰賴工作目錄的支援的話,就要使用WorkingDirectory項目來手動指定程式工作目錄的路徑。

而如果要替執行的程式設定環境變數的話,可以透過一個或是數個Environment項目來設定,一個Environment項目可以設定多個環境變數。



沒有留言:

張貼留言