You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash脚本让Ubuntu上的.NET应用崩溃后自动重启

.NET应用崩溃自动重启的Bash脚本实现

问题根源

你之前的写法出错是因为nohup dotnet ... &会让Shell立即返回成功状态,导致while循环里的命令直接触发break,根本起不到监控崩溃重启的作用。要实现需求,得让脚本等待dotnet进程结束,再根据退出状态决定是否重启,同时加锁保证单实例。

最终脚本

#!/bin/bash

# 配置应用参数
APP_DLL="app.dll"
LISTEN_URL="http://adress/"
LOCK_FILE="/var/run/dotnet_app.lock"

# 检查是否已有实例在运行
if [ -f "$LOCK_FILE" ]; then
    RUNNING_PID=$(cat "$LOCK_FILE")
    # 验证PID对应的进程是否存活
    if kill -0 "$RUNNING_PID" 2>/dev/null; then
        echo "应用已在运行,PID: $RUNNING_PID"
        exit 1
    else
        # 锁文件存在但进程已终止,清理锁文件
        rm -f "$LOCK_FILE"
    fi
fi

# 创建锁文件,记录当前脚本PID
echo $$ > "$LOCK_FILE"
# 捕获退出信号,自动清理锁文件
trap "rm -f '$LOCK_FILE'; exit" INT TERM EXIT

# 监控重启循环
while true; do
    echo "[$(date)] 启动.NET应用..."
    # 前台运行dotnet,脚本会等待进程结束
    dotnet "$APP_DLL" --urls="$LISTEN_URL"
    EXIT_CODE=$?
    echo "[$(date)] 应用退出,退出码: $EXIT_CODE"

    # 正常退出(退出码0)则终止循环
    if [ $EXIT_CODE -eq 0 ]; then
        echo "[$(date)] 应用正常退出,停止重启"
        break
    fi

    # 崩溃后延迟3秒重启,避免高频重启
    echo "[$(date)] 3秒后重启应用..."
    sleep 3
done

使用步骤

  1. 将脚本保存为start_app.sh,赋予执行权限:
    chmod +x start_app.sh
    
  2. 用nohup让脚本后台运行,关闭控制台后依然生效:
    nohup ./start_app.sh > app_run.log 2>&1 &
    
    应用和脚本的日志会输出到app_run.log文件,方便排查问题。

关键说明

  • 单实例保证:通过/var/run/dotnet_app.lock锁文件记录脚本PID,启动前检查进程是否存活,避免重复启动。
  • 信号处理:trap命令捕获中断、终止等信号,退出时自动删除锁文件,防止锁文件残留导致后续无法启动。
  • 重启逻辑:只有当应用非0退出(崩溃)时才重启,正常退出(主动停止)则终止循环,不会无限重启。

内容的提问来源于stack exchange,提问作者CamouflagedPenguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:47:43