使用 Systemd 開機自動執行腳本,棄用 rc.local

在 Ubuntu 16.04 版本後 rc.local 檔案被除去,所有開機啟動的服務由 systemd 接管,CentOS 7 也正在棄用此方式開機執行,預設情形下 rc.local 此檔案執行權限都移除了。

除此之外 rc.local 執行上並不會留下紀錄,在錯誤排除上也會非常麻煩,建議在可以遷移時盡早遷移。

第一步 建立新的 Systemd 服務

利用 vi 建立一個 Systemd 設定檔案。

sudo vi /etc/systemd/system/log_pppoe_ip.service

將以下設定檔內容填入文件中,ExecStart後方接是執行腳本的路徑。

[Unit]
After=network.service
Description=Log PPPoE ip

[Service]
ExecStart=/usr/local/bin/log_pppoe_ip.sh
Type=oneshot

[Install]
WantedBy=default.targe

After:指示systemd關於何時應運行腳本。在例子中腳本將在網絡連線後運行,可以改成mysql.target等
ExecStart:systemd 在啟動時要執行的實際腳本的完整路徑。
Type=oneshot : 此選項適用於只執行一項任務或腳本、執行完畢後立即退出的服務。
WantedBy:應將 systemd 單元安裝到哪個啟動目標中。

第二步 建立腳本

將腳本建立在可讀取的地方,示範中將腳本放在 /usr/local/bin/ 路徑下。

sudo vi /usr/local/bin/log_pppoe_ip.sh
#!/bin/bash
# 紀錄 PPPoE IP
# V 1.0.0 BY CJK https://www.cjkuo.net/

while [ "$(ip addr show ppp0 2>&1 | grep -c inet)" = "0" ]
do
    # PPPoe 撥號尚未完成
    sleep 2
done
pppoe_ip="$(ip address show ppp0 | grep inet |awk '{print $2}')" >> /tmp/pppoe.log

第三步 修改執行權限

變更檔案執行權限,讓 Systemd 程序可以正確執行。

#變更腳本運行權限。
sudo chmod 744 /usr/local/bin/log_pppoe_ip.sh
#變更 Systemd 設定檔權限
sudo chmod 664 /etc/systemd/system/log_pppoe_ip.service

第四步 重新載入,設定開機啟動

#重新載入 Systemd 設定檔
sudo systemctl daemon-reload
#設定開機啟動 log_pppoe_ip 服務
sudo systemctl enable log_pppoe_ip

第五步 重新開機測試

 AAA@AAAA:/web/shell$ systemctl status log_pppoe_ip.service 
 ● log_pppoe_ip.service - Log PPPoE ip
      Loaded: loaded (/etc/systemd/system/log_pppoe_ip.service; enabled; vendor preset: enabled)
      Active: inactive (dead) since Sun 2021-03-21 05:59:01 CST; 4s ago
      Process: 42220 ExecStart=/usr/local/bin/log_pppoe_ip.sh (code=exited, status=0/SUCCESS)
      Main PID: 42220 (code=exited, status=0/SUCCESS)

Mar 21 05:59:01 ap-server systemd[1]: Starting Log PPPoE ip…
Mar 21 05:59:01 ap-server systemd[1]: log_pppoe_ip.service: Succeeded.
Mar 21 05:59:01 ap-server systemd[1]: Finished Log PPPoE ip.

參考來源:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端