在 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)、以及更細緻的服務控制。
參考資料