Note: Create a Process Automation via linux systemd.service (system daemon) ================================================================ 筆者目前擔任之職位中(韌體測試工程師), 有一項目, 謂之"開關機測試" 簡單來說, 就是透過外部開關來控制主機on/off狀態, 再由主機內運行腳本運行測試項目和記錄開關機次數; 最後再和外部開關所搭載之計數器比較,觀察次數是否相符. 以往都將script寫入 **.bashrc**; 然而這次的OS環境沒有自動登入(boot-in後不會自動開啟bash shell)導致腳本失效. 所以改用建立daemon(systemd,系統服務)的手法,並加以記錄 Structure ------------------------------------------------------------------ 運行腳本的檔案結構如下: ![image](https://hackmd.io/_uploads/BJTSq9Qe1e.png) 其中"createSystemDaemon.sh"功能為建立daemon, 和產生自動指令腳本(/etc/rc.local) Details ------------------------------------------------------------------ "createSystemDaemon.sh"內容如下: ![image](https://hackmd.io/_uploads/rybfWoQl1g.png) 產生daemon configuration的具體方法見第16行: **經判斷, 如路徑下無rc-local.service文件, 就複製到路徑/etc/systemd/system/** rc-local.service中的內容: ![image](https://hackmd.io/_uploads/BkFDjdVxyg.png) ### [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](https://zh.wikipedia.org/zh-tw/%E8%BF%90%E8%A1%8C%E7%BA%A7%E5%88%AB))時會啟用此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](https://hackmd.io/_uploads/BJEAGjQgkg.png) Using command & check status ------------------------------------------------------------------ 將整個資料夾複製到裝置後,直接執行`createSystemDaemon.sh`即可 Command: `./createSystemDaemon.sh` 進入系統後可使用以下指令檢視運行狀態 Command: `systemctl status rc-local.service` ![image](https://hackmd.io/_uploads/SkyT4sQe1l.png) Ref. ------------------------------------------------------------------ [系統服務管理基礎教學與範例](https://blog.gtwang.org/linux/linux-basic-systemctl-systemd-service-unit-tutorial-examples/) [Debian / Ubuntu 開機自動執行 Shell Script](https://www.ltsplus.com/linux/debian-ubuntu-shell-script-startup) [Shell Script 檢查檔案或目錄是否存在](https://www.ltsplus.com/linux/shell-script-check-file-dir-exists) [How to Check If a File Exists in Linux Bash Scripts](https://www.howtogeek.com/815684/bash-check-if-file-exists/) [create systemd service](https://cloud.tencent.com/developer/article/2384392) [about rc.local](https://blog.csdn.net/qq_43307934/article/details/130366433) [鳥哥:系統服務與開機流程](https://linux.vbird.org/linux_basic_train/centos7/unit13.php)