您现在的位置是:首页 > 随手笔记网站首页随手笔记

[Ubunt]Systemd 开机自启服务自动生成脚本

  • 小鑫
  • 2026-06-16 02:02:17
  • 131 次阅读
#!/bin/bash # ============================================================================== # Systemd 开机自启服务自动生成脚本 # 功能: # 1. 支持拖拽输入程序路径...
#!/bin/bash
# ==============================================================================
# Systemd 开机自启服务自动生成脚本
# 功能:
# 1. 支持拖拽输入程序路径,自动清除首尾单/双引号
# 2. 判断文件后缀:.py 文件使用 python3 解释器启动,其他文件直接执行
# 3. 自动提取目录、文件名生成对应服务名
# 4. 自动配置工作目录、开机自启、异常重启、日志输出
# 5. 自动使用当前执行脚本的用户作为运行用户,无需手动输入
# 6. 日志输出到本地文件,单文件上限0.5M自动轮转,避免日志爆满
# ==============================================================================

# 读取用户拖拽输入的文件原始路径
read -p "请拖入你的启动程序绝对路径:" raw_path

# 清理路径首尾多余符号:单引号 ' 、双引号 ",解决带引号报错问题
RUN_FILE=$(echo "$raw_path" | sed -e "s/^'//" -e "s/'$//" -e 's/^"//' -e 's/"$//')

# 校验文件是否真实存在,不存在直接退出脚本
if [ ! -f "$RUN_FILE" ]; then
    echo "错误:文件 [$RUN_FILE] 不存在,请核对路径!"
    exit 1
fi

# 自动拆分路径信息
WORK_DIR=$(dirname "$RUN_FILE")       # 获取文件所在文件夹(工作目录)
FILENAME=$(basename "$RUN_FILE")      # 获取纯文件名
SERVICE_NAME="${FILENAME%.*}"         # 去除后缀作为服务名
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" # 完整服务文件路径
LOG_FILE="${WORK_DIR}/${SERVICE_NAME}.log" # 本地日志文件

# 根据文件后缀判断启动命令
# 后缀为.py:使用python3解释器运行;其他文件直接执行二进制/脚本
if [[ "$FILENAME" == *.py ]]; then
    EXEC_CMD="/usr/bin/python3 $RUN_FILE"
else
    EXEC_CMD="$RUN_FILE"
fi

# 获取当前执行脚本的真实用户名(自动适配,无需手动输入)
# 即使使用sudo执行,也会取原本登录的普通用户
if [ -n "$SUDO_USER" ]; then
    RUN_USER="$SUDO_USER"
else
    RUN_USER="$USER"
fi
echo "程序运行用户自动识别为:$RUN_USER"
echo "本地日志文件路径:$LOG_FILE"

# 给目标程序添加可执行权限
chmod +x "$RUN_FILE"

# 写入 systemd service 配置文件
sudo tee "$SERVICE_FILE" > /dev/null <<EOF
[Unit]
# 服务描述,自动填充当前文件名
Description=Auto Run Service: $FILENAME
# 等待网络就绪后再启动程序
After=network.target

[Service]
# 设置程序运行的工作目录,避免相对路径找不到文件
WorkingDirectory=$WORK_DIR
# 自动生成的启动命令(py带python3,其他直接运行)
ExecStart=$EXEC_CMD
# 指定运行用户
User=$RUN_USER
# 程序异常退出时自动重启
Restart=on-failure
# 重启间隔10秒
RestartSec=10
# 日志输出:系统journal + 本地文件追加写入
StandardOutput=append:$LOG_FILE
StandardError=append:$LOG_FILE
# 限制单日志文件最大500KB(0.5M),超过自动新建轮转文件
SystemdMaxFileSize=500K
# 最多保留3个轮转日志文件,防止磁盘占满
SystemdMaxFiles=3

[Install]
# 多用户模式开机自启
WantedBy=multi-user.target
EOF

# 重载systemd配置,让系统识别新创建的服务
sudo systemctl daemon-reload
# 设置开机自动启动
sudo systemctl enable "$SERVICE_NAME"
# 立即启动当前服务
sudo systemctl restart "$SERVICE_NAME"

# 绿色输出完成信息
echo -e "\033[32m====================处理完成====================\033[0m"
echo "服务名称:$SERVICE_NAME.service"
echo "程序文件:$RUN_FILE"
echo "执行命令:$EXEC_CMD"
echo "工作目录:$WORK_DIR"
echo "运行用户:$RUN_USER"
echo "本地日志文件:$LOG_FILE"
echo "查看运行状态:sudo systemctl status $SERVICE_NAME"
echo "实时打印系统日志:journalctl -u $SERVICE_NAME -f"
echo "直接查看本地日志:tail -f $LOG_FILE"


TAG: 无标签

上一篇:[Ubuntu]代理NAT上网

下一篇:已经是最后一篇

文章评论 (0)

    • 这篇文章还没有收到评论,赶紧来抢沙发吧~


Top