.NET 应用程序 Linux下守护进程脚本编写

下面的脚本是生产可用,可靠的sh脚本,用于监控 .NET 应用程序并自动重启。

假如你打包发布到Linux的程序名称为MyAspDemo;

推荐打包模式为框架依赖:需要在Linux上安装对应的donet版本;

1.在Linux下新建一个文件,如:

bash 复制代码
mkdir dotnet-monitor.sh

如上新建了一个名为 dotnet-monitor.sh的脚本文件,打开脚本文件,添加如下内容:

bash 复制代码
#!/bin/bash

# 配置
APP_NAME="MyAspDemo"                           # 应用名称
APP_DIR="/opt/services/publish"                   # 应用所在目录
APP_DLL="MyAspDemo.Api.dll"                        # 主程序集
DOTNET_CMD="dotnet"                        # dotnet 命令
LOG_FILE="/var/log/dotnet-monitor.log"     # 日志文件
CHECK_INTERVAL=30                          # 检查间隔(秒)
MAX_RESTARTS=5                             # 最大重启次数(防崩溃循环)
RESTART_COOLDOWN=60                        # 重启冷却时间(秒)

# 函数:记录日志
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 函数:检查应用是否在运行
is_running() {
    pgrep -f "dotnet.*$APP_DLL" > /dev/null
}

# 函数:启动应用
start_app() {
    log "启动应用: $APP_NAME"
    cd "$APP_DIR" || { log "无法进入目录: $APP_DIR"; return 1; }
    
    nohup $DOTNET_CMD "$APP_DLL" > /dev/null 2>&1 &
    
    sleep 5  # 等待进程启动
    if is_running; then
        log "应用已启动"
        return 0
    else
        log "启动失败"
        return 1
    fi
}

# 函数:停止应用
stop_app() {
    log "停止应用: $APP_NAME"
    pkill -f "dotnet.*$APP_DLL"
    sleep 3
}

# 主循环
restart_count=0
last_restart=$(date +%s)

log "启动,监控: $APP_NAME"

while true; do
    if ! is_running; then
        log "应用未运行,尝试重启..."

        # 检查是否在冷却期内(防频繁重启)
        current_time=$(date +%s)
        time_since_last=$((current_time - last_restart))

        if [ $restart_count -ge $MAX_RESTARTS ] && [ $time_since_last -lt $RESTART_COOLDOWN ]; then
            log "重启次数过多,进入冷却期..."
            sleep $RESTART_COOLDOWN
            restart_count=0
            last_restart=$(date +%s)
        else
            stop_app
            if start_app; then
                restart_count=$((restart_count + 1))
                last_restart=$(date +%s)
            else
                log "启动失败,等待下次检查..."
            fi
        fi
    else
        log "应用正在运行"
    fi

    sleep $CHECK_INTERVAL
done

2.为刚刚创建的脚本文件添加执行权限:

bash 复制代码
sudo chmod +x /opt/dotnet-monitor.sh

3.创建systemd service文件,如下:

bash 复制代码
vi /etc/systemd/system/dotnet-monitor.service

添加如下内容:

bash 复制代码
[Unit]
Description=DotNet Monitor
After=network.target

[Service]
Type=simple    
User=www-admin    //自定义名称
WorkingDirectory=/opt
ExecStart=/opt/service/dotnet-monitor.sh  //脚本所在目录
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

4.启动服务:

bash 复制代码
sudo systemctl daemon-reexec
sudo systemctl enable dotnet-monitor.service
sudo systemctl start dotnet-monitor.service

ok

相关推荐
Decay__2 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子4 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
HideF5 小时前
Linux
linux·服务器·网络
万联WANFLOW5 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
Ruiery7 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
乌恩大侠7 小时前
从 AI-RAN 到 AI Agent:基于 NVIDIA Nemotron 构建 5G/6G 智能网络故障诊断系统
服务器·人工智能·5g·o-ru·ai-ran·电信大模型
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
丰锋ff9 小时前
压缩命令笔记
linux
江华森9 小时前
数据中心基础设施运维实战:概述与实验环境搭建
运维
迪菲赫尔曼9 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测