宝塔面板 Shell 脚本怎么写
学完这篇,你能在宝塔面板里从零写出一个能被定时执行的 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删除的文件不进回收站。务必先用-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$//'去掉回车符。
原文链接:https://www.gj0.com/thread-93.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。