Cron任务未触发咨询:测试命令正常但start.sh脚本不执行
你的touch命令能正常运行,说明Cron的时间调度逻辑是没问题的,问题大概率出在脚本执行的环境差异或者脚本本身的细节上。下面是一步步的排查和解决思路:
1. 先确认脚本的执行权限
首先检查/home/folder/start.sh有没有可执行权限,这是最容易忽略的点:
ls -l /home/folder/start.sh
如果输出里没有x权限(比如是-rw-r--r--),赶紧加执行权限:
chmod +x /home/folder/start.sh
之后你可以在Cron里直接写/home/folder/start.sh代替sh /home/folder/start.sh,这样更符合脚本执行的标准方式。
2. 解决工作目录不匹配的问题
Cron默认的工作目录是当前用户的主目录(比如/home/your_username),如果你的start.sh里用到了相对路径(比如./temp/file.txt),那脚本会在主目录下找这个路径,而不是脚本所在的/home/folder/,这肯定会报错。
两种解决办法:
- 在
start.sh的最开头加上切换目录的命令,确保脚本在正确的路径下运行:cd /home/folder || exit 1 # 如果切换目录失败就直接退出,避免后续错误 - 或者在Cron命令里先切换目录再执行脚本:
30 11 * * * cd /home/folder && ./start.sh
3. 修复环境变量缺失的坑
Cron的环境变量非常精简,默认的PATH通常只有/usr/bin:/bin,如果你的脚本里用到了不在这个路径里的命令(比如python3、node或者自定义的工具),Cron根本找不到这些命令,自然执行失败。
解决方式选一种就行:
- 在脚本里所有命令都用绝对路径,比如用
/usr/bin/python3代替python3; - 在Cron命令开头手动设置完整的
PATH:30 11 * * * PATH=/usr/local/bin:/usr/bin:/bin sh /home/folder/start.sh - 或者在脚本开头导入你平时登录时的环境变量(注意如果是root用户的Cron,要对应
/root/.bashrc):source ~/.bashrc
4. 查看Cron执行日志,定位具体错误
很多时候脚本执行失败但没有任何提示,查看Cron日志是最快找到问题的方法:
- 大部分Linux系统可以直接查看
/var/log/cron或者过滤syslog里的Cron内容:grep CRON /var/log/syslog - 也可以在Cron命令里把输出和错误重定向到日志文件,方便自己排查:
这样执行后的所有输出和错误都会写到30 11 * * * sh /home/folder/start.sh >> /home/folder/cron_start.log 2>&1cron_start.log里,打开就能看到具体哪里出问题了。
5. 检查脚本的Shebang行
确认start.sh的第一行有没有正确的shebang(脚本解释器声明),比如如果脚本用了bash的语法,第一行应该是:
#!/bin/bash
如果是sh语法,就是:
#!/bin/sh
没有shebang的话,Cron会用系统默认的shell执行,可能和你手动执行时的shell不一样,导致语法兼容问题。
6. 先手动测试脚本本身
最后,先手动执行脚本,确认脚本本身能正常运行:
sh /home/folder/start.sh
或者加了执行权限后直接运行:
/home/folder/start.sh
如果手动执行也失败,那先修复脚本本身的问题(比如语法错误、依赖缺失等),再放到Cron里测试。
内容的提问来源于stack exchange,提问作者disruptive

