Contents

開機執行程式(/etc/rc.d/rc.local、Update-rc.d)筆記

在 Linux 伺服器上,常常需要在開機時自動執行某些程式或腳本,例如啟動自訂服務、設定系統參數、執行初始化腳本等。本文整理三種常見的方式,從傳統到現代逐一說明。

方式一:/etc/rc.local(傳統方式,最簡單)

/etc/rc.local 是 Linux 傳統的開機自動執行腳本,系統啟動完成後會自動執行這個檔案。

設定方式

1
sudo nano /etc/rc.local

exit 0 之前加入你要執行的指令:

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 啟動自訂服務
/home/user/myapp/start.sh

# 設定系統參數
echo 1 > /proc/sys/net/ipv4/ip_forward

exit 0

確保檔案有執行權限:

1
sudo chmod +x /etc/rc.local

Ubuntu 16.04+ 注意事項

Ubuntu 16.04 以後使用 systemd,rc.local 服務預設可能未啟用:

1
2
3
# 啟用 rc-local 服務
sudo systemctl enable rc-local
sudo systemctl start rc-local

/etc/rc.local 不存在,手動建立:

1
2
3
4
5
6
7
sudo tee /etc/rc.local << 'EOF'
#!/bin/bash
# 在此加入開機指令

exit 0
EOF
sudo chmod +x /etc/rc.local

方式二:update-rc.d(SysV init,適合舊版系統)

update-rc.d 是管理 SysV init 啟動腳本的工具,適用於較舊的 Debian / Ubuntu 系統。

建立 init 腳本

1
sudo nano /etc/init.d/myapp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    $network $local_fs
# Required-Stop:     $network $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: My Application
### END INIT INFO

case "$1" in
    start)
        echo "Starting myapp..."
        /home/user/myapp/start.sh
        ;;
    stop)
        echo "Stopping myapp..."
        /home/user/myapp/stop.sh
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
exit 0

設定開機啟動

1
2
3
sudo chmod +x /etc/init.d/myapp
sudo update-rc.d myapp defaults     # 加入開機啟動
# sudo update-rc.d myapp remove   # 移除開機啟動

方式三:systemd service(現代方式,最推薦)

現代 Linux 發行版(Ubuntu 15.04+、Debian 8+、CentOS 7+)預設使用 systemd,這是目前最推薦的方式,功能最完整且管理方便。

建立 service 檔案

1
sudo nano /etc/systemd/system/myapp.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=My Application
After=network.target
Wants=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/home/appuser/myapp
ExecStart=/usr/bin/node /home/appuser/myapp/server.js
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

啟用並啟動服務

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 重新載入 systemd 設定
sudo systemctl daemon-reload

# 啟用開機自動啟動
sudo systemctl enable myapp

# 立即啟動服務
sudo systemctl start myapp

# 查看服務狀態
sudo systemctl status myapp

# 查看 log
sudo journalctl -u myapp -f

常用 systemctl 指令

1
2
3
4
5
6
7
systemctl start myapp     # 啟動
systemctl stop myapp      # 停止
systemctl restart myapp   # 重新啟動
systemctl reload myapp    # 重新載入設定(不重啟)
systemctl enable myapp    # 設定開機啟動
systemctl disable myapp   # 取消開機啟動
systemctl status myapp    # 查看狀態

三種方式比較

方式 適用系統 複雜度 功能 推薦程度
/etc/rc.local 大部分 Linux 基本 適合簡單腳本
update-rc.d / SysV 舊版 Debian/Ubuntu 中等 舊系統使用
systemd 現代 Linux 豐富 ✅ 強烈推薦

systemd 的優點包括:自動重啟(Restart=on-failure)、依賴管理(After=)、統一的 log(journalctl)、以及更細緻的服務控制。

參考資料