在 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.