SGTMS

做事情
我们是认真的
您的位置:SGTMS>Linux>Linux任务守护shell脚本

Linux任务守护shell脚本

正文

结合常用的进程名检测和程序运行目录校核实现程序的任务守护,使用nohup启动,脚本中添加sleep实现持续运行,也可添加至系统cron防止系统重启导致任务守护失效。

#!/bin/bash

# 进程守护脚本配置
PROCESS_NAME="your_program"     # 基础进程名(用于初步筛选)
TARGET_DIR="/opt/your_app"      # 必须:程序运行目录(绝对路径)
CHECK_INTERVAL=30              # 检查间隔(秒)
MAX_LOG_SIZE=1048576           # 日志最大大小(1MB)
LOG_FILE="/var/log/process_monitor.log"  # 日志文件路径

# 多行启动命令(必须包含目录切换)
START_COMMAND=(
    "cd $TARGET_DIR"
    "./bin/start.sh --daemon"
)

# 日志记录函数
log() {
    local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    # 日志轮转逻辑(保持不变)
    if [ -f "$LOG_FILE" ]; then
        log_size=$(stat -c%s "$LOG_FILE")
        if [ $log_size -gt $MAX_LOG_SIZE ]; then
            mv "$LOG_FILE" "${LOG_FILE}.1"
            gzip "${LOG_FILE}.1" &> /dev/null
        fi
    fi
    echo "$log_msg" >> "$LOG_FILE"
}

# 增强版PID获取(核心修改)
get_pid() {
    ps -eo pid,comm | awk -v pname="$PROCESS_NAME" '$2 == pname {print $1}' | while read pid; do
        # 获取进程实际运行目录
        local cwd=$(readlink -f /proc/$pid/cwd 2>/dev/null)
        if [ "$cwd" = "$TARGET_DIR" ]; then
            echo $pid
            break
        fi
    done
}

# 启动进程函数(保持目录一致性)
start_process() {
    log "尝试启动目录:$TARGET_DIR"
    (
        cd "$TARGET_DIR" || { log "错误:无法切换目录到 $TARGET_DIR"; exit 1; }
        # 执行启动命令
        eval "$(printf "%s\n" "${START_COMMAND[@]}" | sed 's/#.*$//')" &> /dev/null &
        local pid=$!
        sleep 2
        log "启动命令已执行,临时PID: $pid"
    )
}

# 主循环
log "进程守护脚本启动"
while true; do
    PID=$(get_pid)
    
    if [ -z "$PID" ]; then
        log "检测到进程未运行"
        start_process
        
        # 验证启动结果
        NEW_PID=$(get_pid)
        if [ -n "$NEW_PID" ]; then
            log "进程启动成功,PID: $NEW_PID"
        else
            log "错误:进程启动失败"
        fi
    else
        if ! ps -p $PID > /dev/null; then
            log "检测到僵尸进程(PID:$PID),尝试恢复..."
            start_process
        else
            log "进程运行正常,PID: $PID (已跳过)"
        fi
    fi
    
    sleep $CHECK_INTERVAL
done

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Linux任务守护shell脚本》
文章链接: https://www.sgtms.com/linux/146.html
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
分享到:

相关推荐

网友评论抢沙发

路人甲 表情
Ctrl+Enter快速提交