宝塔面板 Shell 脚本怎么写

juming
juming 正式会员超兽战士
发布于 2026-10-07 05:22 ·0 浏览 ·0 回复

学完这篇,你能在宝塔面板里从零写出一个能被定时执行的 Shell 脚本,并在它不执行时知道去哪个日志、用哪条命令定位问题。

第一步:找到写脚本的入口,先分清两种写法

宝塔面板里写 Shell 脚本有两种方式,先决定用哪种。

第一种是直接把脚本贴在计划任务里。登录面板(以 Linux 版 8.0 为例),左侧菜单点「计划任务」→ 右上角「添加任务」,弹窗里「任务类型」下拉选「Shell脚本」,下方会出现一个多行文本框,脚本就写在这里。

第二种是把 .sh 文件放到服务器上,计划任务里只写一行调用命令。左侧菜单「文件」→ 进入目录(比如 /www/backup/scripts)→ 右上角「新建」→「新建文件」→ 文件名填 clean.sh → 确定。脚本较长、需要反复修改时用这种方式。

注意:计划任务里的「Shell脚本」文本框内容长了容易出错,脚本超过二三十行就改用第二种,文本框里只写 bash /www/backup/scripts/clean.sh。

第二步:搞清执行环境,避免路径踩坑

宝塔的计划任务由 crontab 触发,运行用户是 root,但环境变量极其精简。你本地终端里能跑通的命令,放到计划任务里经常报 command not found。

先在面板「终端」里确认两件事:

which bash
cat /etc/os-release

然后让脚本开头固定三行:

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cd /www/wwwroot

注意:脚本里所有文件路径都写绝对路径。crontab 的工作目录默认是 root 的家目录,用相对路径必然找不到文件。

第三步:写一个真正能用的脚本

以「清理 7 天前的站点日志」为例,在面板「文件」里编辑 /www/backup/scripts/clean.sh:

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

LOG_DIR="/www/wwwlogs"
KEEP_DAYS=7


find "$LOG_DIR" -name "*.log" -type f -mtime +$KEEP_DAYS -print

# 确认无误后注释掉上面这行,启用下面这行
# find "$LOG_DIR" -name "*.log" -type f -mtime +$KEEP_DAYS -delete

echo "$(date '+%Y-%m-%d %H:%M:%S') 日志清理完成"

保存后加执行权限:在「文件」里右键该文件 →「权限」→ 把「所有者」一行的「执行」勾上;或在终端执行 chmod +x /www/backup/scripts/clean.sh。

注意:find -delete 删除的文件不进回收站。务必先用 -print 跑一遍看输出列表,确认目录和文件范围正确,再改成 -delete。

第四步:挂进计划任务并手动验证

回到「计划任务」→「添加任务」,任务名称填「清理站点日志」,任务类型选「Shell脚本」,执行周期选「每天」,时间填 03:30,脚本内容填:

bash /www/backup/scripts/clean.sh

点「确定」。列表里该任务右侧有「执行」按钮,先手动点一次。再点同一行的「日志」,能看到本次执行的输出和报错——这是排查问题最快的位置。

注意:点了「执行」但日志里空空如也,先检查任务列表里的启用开关是否打开,再确认脚本文件路径是否正确、是否有执行权限。

第五步:脚本不执行时按这个顺序排查

第一,看任务日志,报错一般在最后几行。第二,在面板「终端」里执行 bash -x /www/backup/scripts/clean.sh,-x 会把每一行命令和结果打印出来,能直接定位到出错的那一句。第三,确认定时服务在跑:CentOS 系执行 systemctl status crond,Debian/Ubuntu 系执行 systemctl status cron。第四,执行 crontab -l,看宝塔是否真的把任务写进了系统计划任务。

如果脚本是从 Windows 复制过来的,报 syntax error near unexpected token 之类的错,基本是换行符问题,执行:

sed -i 's/\r$//' /www/backup/scripts/clean.sh

第六步:面板自身也能用命令行脚本操作

在终端输入 bt 回车,会列出带编号的菜单,可以查看面板默认信息、重启面板等。写自动化脚本时可以用 bt default 查看面板入口地址。

注意:bt 菜单编号在不同版本里会变化,脚本里不要写死编号,涉及账号密码的操作也不建议放进定时脚本。

小结

  • 短脚本直接写在「计划任务 → 添加任务 → Shell脚本」里;长脚本放 /www/backup/scripts 下,用 bash 绝对路径 调用。
  • 脚本开头固定 shebang、export PATH、cd 绝对目录,其余路径全部写全。
  • 破坏性命令先用 -print 试跑,确认无误再改 -delete。
  • 出问题看三处:任务日志、bash -x 输出、systemctl status crond/cron。
  • Windows 传来的脚本先执行 sed -i 's/\r$//' 去掉回车符。
版权声明:本文来自 GJ论坛《宝塔面板 Shell 脚本怎么写》
原文链接:https://www.gj0.com/thread-93.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~