要在 Ubuntu Server 重新開機後自動執行指令,最簡單且標準的做法是使用 systemd 建立一個服務。這比舊式的 crontab 更穩定,還能在程式當掉時自動重啟。
建立 Service 檔案
請使用 sudo 權限建立一個新的設定檔,檔名可以自訂,這裡假設為 http-server.service:
sudo nano /etc/systemd/system/http-server.service
編輯服務內容
將以下內容貼進檔案中。請注意,ExecStart 必須使用完整的絕對路徑。你可以先在終端機輸入 which npx 找出路徑,通常是 /usr/bin/npx:
[Unit]
Description=HTTP Server Instance
After=network.target
[Service]
Type=simple
User=你的使用者名稱
WorkingDirectory=/你想提供檔案的資料夾路徑
ExecStart=/usr/bin/npx -y http-server -p 8080 -c-1
Restart=always
[Install]
WantedBy=multi-user.target
啟動並設定開機執行
存檔離開後,執行以下指令讓系統偵測到新服務,並設定為開機自動啟動:
sudo systemctl daemon-reload
sudo systemctl enable http-server.service
sudo systemctl start http-server.service
確認狀態
你可以透過以下指令檢查服務是否正常跑起來:
sudo systemctl status http-server.service
這樣設定完成後,即便伺服器重啟,該 HTTP 服務也會自動在背景運作。如果你需要查看該程式輸出的 log,可以使用 journalctl -u http-server.service 指令。
這是一個可以幫你自動完成所有設定的 Bash 腳本。你可以直接將這段程式碼複製並存成 setup-server.sh,或者直接在終端機貼上執行。
#!/bin/bash
# 取得目前使用者的名稱與家目錄路徑
CURRENT_USER=$(whoami)
WORK_DIR=$(pwd)
NPX_PATH=$(which npx)
# 檢查是否有安裝 npx
if [ -z "$NPX_PATH" ]; then
echo "錯誤:找不到 npx,請先安裝 Node.js 與 npm。"
exit 1
fi
# 建立 systemd service 檔案
sudo bash -c "cat <<EOM > /etc/systemd/system/http-server.service
[Unit]
Description=HTTP Server Instance
After=network.target
[Service]
Type=simple
User=$CURRENT_USER
WorkingDirectory=$WORK_DIR
ExecStart=$NPX_PATH -y http-server -p 8080 -c-1
Restart=always
[Install]
WantedBy=multi-user.target
EOM"
# 重新載入設定並啟動服務
sudo systemctl daemon-reload
sudo systemctl enable http-server.service
sudo systemctl start http-server.service
echo "服務已建立並啟動,現在會隨開機自動執行。"
sudo systemctl status http-server.service --no-pager
使用說明
這個腳本會以你執行腳本當下的資料夾作為伺服器的根目錄。如果你想要更改目錄,可以手動修改腳本中的 WORK_DIR 變數。執行前記得給予執行權限:
chmod +x setup-server.sh
./setup-server.sh
未來如果想要停止這個服務,可以使用 sudo systemctl stop http-server.service。
如果要在一台伺服器上跑多個服務,最好的做法是將服務名稱參數化,這樣你就能針對不同的資料夾與連接埠建立多個獨立的服務設定檔。
多服務自動化腳本
你可以修改腳本,讓它接受「服務名稱」、「連接埠」和「目錄」三個參數:
#!/bin/bash
# 檢查參數數量
if [ "$#" -ne 3 ]; then
echo "使用方式: $0 [服務名稱] [連接埠] [目錄路徑]"
echo "範例: $0 web-docs 8081 /var/www/docs"
exit 1
fi
SERVICE_NAME=$1
PORT=$2
TARGET_DIR=$3
CURRENT_USER=$(whoami)
NPX_PATH=$(which npx)
# 檢查目錄是否存在
if [ ! -d "$TARGET_DIR" ]; then
echo "錯誤:目錄 $TARGET_DIR 不存在。"
exit 1
fi
# 建立獨立的 service 檔案
SERVICE_FILE="/etc/systemd/system/http-server-${SERVICE_NAME}.service"
sudo bash -c "cat <<EOM > $SERVICE_FILE
[Unit]
Description=HTTP Server - $SERVICE_NAME
After=network.target
[Service]
Type=simple
User=$CURRENT_USER
WorkingDirectory=$TARGET_DIR
ExecStart=$NPX_PATH -y http-server -p $PORT -c-1
Restart=always
[Install]
WantedBy=multi-user.target
EOM"
# 啟動新服務
sudo systemctl daemon-reload
sudo systemctl enable "http-server-${SERVICE_NAME}.service"
sudo systemctl start "http-server-${SERVICE_NAME}.service"
echo "服務 $SERVICE_NAME 已在連接埠 $PORT 啟動,目錄為 $TARGET_DIR"
如何使用此腳本
將上述內容存成 add-server.sh 並加上執行權限。你可以重複執行它來建立多個服務:
chmod +x add-server.sh
# 建立第一個服務 (連接埠 8081)
./add-server.sh project-a 8081 /home/user/project-a
# 建立第二個服務 (連接埠 8082)
./add-server.sh project-b 8082 /home/user/project-b
管理多個服務
當你建立多個服務後,管理方式如下:
- 查看所有服務狀態:
systemctl list-units "http-server-*" - 停止特定服務:
sudo systemctl stop http-server-project-a - 查看特定服務日誌:
journalctl -u http-server-project-a -f
創建第一個服務:
./add-server.sh clear-nano 8081 /home/max/ClearNano
啟動服務:
sudo systemctl start http-server-clear-nano
檢查狀態:
sudo systemctl status http-server-clear-nano