Linux下實現程式開機自啟(rc.local 和 systemctl)

2023-07-26 18:00:56

需求:

實現了一個程式,需要在ubuntu上跑起來。能開機自啟,且崩潰了也能自己重啟。有兩種實現方式,個人推薦第二種。

方式1:

實現方式:

直接將要啟動程式的執行命令加在 /etc/rc.local 中,開機時會執行這裡的命令。
我使用時:寫了一個指令碼DDR_Guard.sh,在指令碼裡面迴圈判斷程式有沒有開啟。如果沒有開啟,則呼叫相應的啟動指令。
比如:

注意:

1)此方式在Ubuntu20.04之後就取消了,只在Ubuntu16.04中測試可行。
2)在 /etc/rc.local 中的命令一定要可以結束,如果結束不了會導致系統開不起來。所以我用了後臺執行:也就是nohup。

方式2(推薦使用):

採用systemctl的方式,好像很挺方便的樣子。(實際用時把youngtest換成自己需要的名字即可)

強烈建議看看這個檔案,裡面介紹了一些引數的具體含義:https://ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

準備工作:

1)為了測試,我寫了一個程式test0726,裡面迴圈往一個檔案裡面輸入一句話。
2)還寫了一個指令碼:youngtest.sh

#!/bin/bash
cd /home/dadao/workspace/test/systemctltestLog
v_time=`date "+%Y_%m_%d_%H_%M_%S"`
echo $v_time" Start runing ++++++++++++++++++++ " >> youngtestsh.log
./test0726
echo $v_time" Process quit ---------------------- " >> youngtestsh.log

3)需要有執行許可權:chmod +x youngtest.sh test0726

如何設定:

1)編寫一個 youngtest.service,內容如下:

[Unit]
Description=test

[Service]
Type=simple
User=dadao
ExecStart=/home/dadao/workspace/test/systemctltestLog/youngtest.sh
Restart=always
RestartSec=30
StartLimitInterval=0
 
[Install]
WantedBy=multi-user.target graphical.target

以下引數根據實際需要進行設定:

User:表示以哪個使用者啟動,不寫預設是root。

ExecStart:就是要執行的語句。

Restart=always: 只要不是通過systemctl stop來停止服務,任何情況下都必須要重啟服務,預設值為no。還可以設定有條件重啟,具體參考上述檔案。
RestartSec=5: 重啟間隔,比如某次異常後,等待5(s)再進行啟動,預設值0.1(s)
StartLimitInterval: 無限次重啟,預設是10秒內如果重啟超過5次則不再重啟,設定為0表示不限次數重啟

2)拷貝到: /lib/systemd/system  可能還要注意許可權問題。

3)修改組態檔後需要過載入設定:

sudo systemctl daemon-reload

4)設定開機自啟:

sudo systemctl enable youngtest.service

之後就可以直接重啟了。

5)之後就可以操作了:
啟動:

sudo systemctl start youngtest.service

停止:

sudo systemctl stop youngtest.service

 檢視狀態:

sudo systemctl status youngtest.service

測試自動重啟功能: