正文
结合常用的进程名检测和程序运行目录校核实现程序的任务守护,使用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
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
文章名称:《Linux任务守护shell脚本》
文章链接: https://www.sgtms.com/linux/146.html
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
网友评论抢沙发