如何编写可检测服务与页面运行状态的Cronjob定时任务?
Cronjob两类定时检测任务实现方案
一、服务状态检测+自动拉起实现
1. 编写检测脚本
新建脚本文件/opt/scripts/check_service.sh,内容如下,可根据实际需求替换变量:
#!/bin/bash # 替换为你需要检测的服务名(对应systemctl status的服务名) TARGET_SERVICE="nginx" # 可选:日志存储路径,方便排查问题 LOG_PATH="/var/log/check_service.log" # systemd管理的服务检测逻辑 if ! systemctl is-active --quiet "$TARGET_SERVICE"; then echo "$(date "+%Y-%m-%d %H:%M:%S") 检测到${TARGET_SERVICE}未运行,执行拉起操作" >> ${LOG_PATH} systemctl start ${TARGET_SERVICE} fi
如果是没有用systemd管理的进程,将上述检测逻辑替换为以下内容即可:
# 替换为实际进程名(对应ps查询的进程名) TARGET_PROCESS="your_process_name" if ! pgrep -x "${TARGET_PROCESS}" > /dev/null; then # 这里替换为你的进程启动命令 /usr/bin/your_process_start_command fi
2. 配置执行权限和Cron规则
- 给脚本加执行权限:
chmod +x /opt/scripts/check_service.sh - 手动执行脚本测试功能是否正常:
/bin/bash /opt/scripts/check_service.sh - 执行
crontab -e添加定时规则,以下配置为每分钟检测一次:* * * * * /bin/bash /opt/scripts/check_service.sh
二、HTTP状态码检测+自定义逻辑实现
1. 编写检测脚本
新建脚本文件/opt/scripts/check_http.sh,内容如下:
#!/bin/bash # 替换为待检测的页面URL TARGET_URL="https://your-domain.com/test-page" # 替换为状态码异常时要执行的自定义bash脚本路径 CUSTOM_ACTION="/opt/scripts/your_custom_bash.sh" # 可选:日志存储路径 LOG_PATH="/var/log/check_http.log" # 获取HTTP响应状态码,需要跳过证书校验可添加-k参数 STATUS_CODE=$(curl -o /dev/null -s -w "%{http_code}\n" --connect-timeout 10 "${TARGET_URL}") if [ "${STATUS_CODE}" != "200" ]; then echo "$(date "+%Y-%m-%d %H:%M:%S") 检测到${TARGET_URL}状态码异常: ${STATUS_CODE}" >> ${LOG_PATH} /bin/bash ${CUSTOM_ACTION} fi
2. 配置执行权限和Cron规则
- 给脚本加执行权限:
chmod +x /opt/scripts/check_http.sh - 手动测试脚本功能:将URL替换为不存在的地址,执行脚本看是否触发自定义逻辑
- 执行
crontab -e添加定时规则,以下配置为每5分钟检测一次:*/5 * * * * /bin/bash /opt/scripts/check_http.sh
常见运行异常排查点
- 所有脚本内涉及的命令、文件路径都建议使用绝对路径,可通过
which 命令名查询命令的绝对路径,避免Cron执行时因环境变量不全找不到资源 - 需要root权限的操作(比如启动系统服务),要编辑root用户的crontab:
sudo crontab -e - 脚本无法正常触发时优先查看日志文件,或者在Cron规则后追加日志输出,比如
* * * * * /bin/bash/xxx.sh >> /var/log/cron_test.log 2>&1
内容的提问来源于stack exchange,提问作者user14126119
相关产品推荐
相关产品推荐

