Note: Create a Process Automation via linux systemd.service (system daemon)

筆者目前擔任之職位中(韌體測試工程師), 有一項目, 謂之"開關機測試"
簡單來說, 就是透過外部開關來控制主機on/off狀態, 再由主機內運行腳本運行測試項目和記錄開關機次數; 最後再和外部開關所搭載之計數器比較,觀察次數是否相符.
以往都將script寫入 .bashrc; 然而這次的OS環境沒有自動登入(boot-in後不會自動開啟bash shell)導致腳本失效.
所以改用建立daemon(systemd,系統服務)的手法,並加以記錄

Structure

運行腳本的檔案結構如下:
image

其中"createSystemDaemon.sh"功能為建立daemon, 和產生自動指令腳本(/etc/rc.local)

Details

"createSystemDaemon.sh"內容如下:

image
產生daemon configuration的具體方法見第16行:
經判斷, 如路徑下無rc-local.service文件, 就複製到路徑/etc/systemd/system/

rc-local.service中的內容:
image

[Unit]

Description:描述daemon,表示它是為了相容/etc/rc.local的服務
ConditionPathExists:只有在/etc/rc.local存在時才會啟動daemon;如果這個檔案不存在則不執行

[Service]

Type=forking:表示這是一個會產生子行程(fork)的服務,啟動後父行程會退出,子行程在背景執行
ExecStart:daemon主要執行的內容;其中的/etc/rc.local start,表示執行該script中寫入的指令
TimeoutSec=0:無超時時間,也就是systemd會等待它完成。
StandardOutput=tty:指定標準輸出為TTY(電傳打字機,粗淺的說即是一般終端機文字界面),方便除錯時檢視狀態
RemainAfterExit=yes:"保持存在":rc.local執行完畢且退出,systemd仍會將此daemon標記為「仍在執行」,確保它不會被重啟或標記為失敗。

[Install]

WantedBy=multi-user.target:這表示當系統進入"多重使用者狀態"(可以理解為執行級別3)時會啟用此daemon

接著啟用daemon:
systemctl enable rc-local.service

確保systemd-service建立之後, 再建立設定檔: rc.local; 詳見第21~24行:
touch /etc/rc.local
echo \#\!\/bin\/bash >> /etc/rc.local

最後, 將 開機自動執行程序加入 rc.local中, 並給予權限

範例:
image

Using command & check status

將整個資料夾複製到裝置後,直接執行createSystemDaemon.sh即可
Command: ./createSystemDaemon.sh

進入系統後可使用以下指令檢視運行狀態
Command: systemctl status rc-local.service
image

Ref.

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

Debian / Ubuntu 開機自動執行 Shell Script

Shell Script 檢查檔案或目錄是否存在

How to Check If a File Exists in Linux Bash Scripts

create systemd service

about rc.local

鳥哥:系統服務與開機流程

Select a repo