宝塔定时任务执行巡检脚本需用绝对路径解释器和命令、显式设置PATH、切换工作目录;钉钉推送须用加签JSON格式;巡检聚焦服务存活、资源阈值、路径可写;调试应加日志、模拟执行。

巡检脚本怎么写才能被宝塔定时任务正确执行
宝塔的「计划任务」底层调用的是 cron,但默认以 www 用户身份运行,且环境变量极简(几乎不加载 /etc/profile 或用户 ~/.bashrc),直接写 python3、curl 或自定义命令常报 command not found。
实操建议:
- 脚本第一行必须写完整解释器路径,比如
#!/bin/bash或#!/usr/bin/env bash;不要用#!/usr/bin/bash(部分系统不存在) - 所有命令用绝对路径:查
which curl得到/usr/bin/curl,就写/usr/bin/curl;查which python3得到/usr/bin/python3,同理 - 需要读取环境变量(如
PATH)时,在脚本开头显式补全:export PATH="/usr/local/bin:/usr/bin:/bin" - 避免依赖当前工作目录,脚本内用
cd /www/wwwroot/your-site切到明确路径,或所有文件操作用绝对路径
钉钉机器人怎么接收 Shell 脚本推送的巡检结果
钉钉群自建机器人需开启「自定义关键词」或「加签」(推荐加签,更安全),获取 Webhook 地址后,不能直接 curl -X POST 发纯文本——钉钉只认特定 JSON 格式的消息体,否则 400 或静默丢弃。
实操建议:
- 消息体必须是
application/json,且含msgtype: "text"或"markdown";推荐用markdown,支持换行和简单样式 - 加签模式下,
timestamp和sign必须动态生成:先取当前毫秒时间戳($(date +%s%3N)),再拼接"${timestamp}\n${secret}"做 SHA256,最后 Base64 编码 - Shell 里生成 sign 需依赖
openssl和base64,确保已安装:which openssl base64 - 示例片段(关键字段替换为你的值):
timestamp=$(date +%s%3N)
secret="YOUR_DINGTALK_SECRET"
string_to_sign="${timestamp}\n${secret}"
sign=$(echo -n "${string_to_sign}" | openssl sha256 | awk '{print $2}' | xxd -r -p | base64)
/usr/bin/curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN×tamp='${timestamp}'&sign='${sign} \
-H 'Content-Type: application/json' \
-d '{"msgtype": "markdown", "markdown": {"title": "服务器巡检", "text": "- 主机名:`hostname`\n- 负载:`uptime | awk -F \": \" \"{print \$2}\"`\n- 磁盘:`df -h /www | tail -1 | awk \"{print \$5, \$4}\"`"}}'哪些系统指标适合日常巡检且能用 Shell 快速获取
别堆砌指标,重点覆盖「服务是否活着」「资源是否快爆」「关键路径是否可写」三类。宝塔本身监控已覆盖 CPU/内存趋势,脚本应补足其盲区。
实操建议:
-
nginx和php-fpm进程数:用pgrep -f 'nginx: master' | wc -l,为 0 就告警 - /www 目录磁盘使用率:用
df -h /www | awk 'NR==2 {print $5}' | sed 's/%//',>90 就触发提醒 - SSL 证书剩余天数:用
openssl x509 -in /www/server/panel/vhost/cert/YOUR_DOMAIN/fullchain.pem -enddate -noout 2>/dev/null | cut -d' ' -f4- | xargs -I{} date -d {} +%s 2>/dev/null,再和$(date +%s)比差值 - 网站根目录是否可写:用
test -w /www/wwwroot/default && echo ok || echo fail,避免因权限问题导致更新失败却无感知
宝塔定时任务里怎么调试脚本不生效的问题
宝塔界面上点「执行」看似成功,但实际没推送、没写日志,大概率是权限或路径问题。它的「执行日志」只记录 cron 返回码,不捕获 stdout/stderr。
实操建议:
- 在脚本末尾加
echo "$(date): done" >> /tmp/inspect.log 2>&1,强制把所有输出追加进日志文件 - 检查宝塔任务设置里的「执行周期」是否填错:例如想每天 8 点执行,应填
0 8 * * *,不是8 * * * *(后者是每小时第 8 分钟) - 确认任务「执行用户」选的是
root(尤其涉及systemctl、df、iptables等需 root 权限的命令) - 临时把脚本第一行改成
#!/bin/bash -x,打开 debug 模式,配合日志看哪一步卡住
真正麻烦的不是写脚本,而是每次改完都要等 cron 触发才验证;建议先手动用 sudo -u root /bin/bash /path/to/inspect.sh 模拟执行,再看钉钉和日志是否同步更新。

















