I
Member
先讲现象:手动跑脚本一切正常,放进 crontab 就静默失败、不报错也不出结果,十有八九是环境差异。
第一,查环境变量:cron 的 PATH 极小,脚本里写相对路径、裸命令名都会失效,做法是脚本开头显式 export PATH,或全用绝对路径,先加一行 env 输出到日志验证。
第二,查工作目录:cron 默认在家目录跑,脚本里读相对路径配置文件必然读错,脚本开头 cd 到固定目录或全部用绝对路径。
第三,查输出去向:cron 默认把输出发邮件,没配邮件就等于丢日志,做法是每条任务都重定向到日志文件,标准输出和标准错误分开记,失败时先看日志再猜。
第四,查权限与 shell:脚本在交互 shell 下靠 .bashrc 里的别名和函数,cron 用非交互 shell 不加载它们,把依赖写进脚本本身;另外检查脚本可执行权限和属主。
第五,查时间与时区:服务器时区、夏令时、crontab 表达式里的星期与日期是“或”关系,这些都容易让任务在“以为的时间”之外跑,先用一分钟后的一次性任务验证链路。
你遇到过最隐蔽的 cron 静默失败是什么原因?欢迎分享。
第一,查环境变量:cron 的 PATH 极小,脚本里写相对路径、裸命令名都会失效,做法是脚本开头显式 export PATH,或全用绝对路径,先加一行 env 输出到日志验证。
第二,查工作目录:cron 默认在家目录跑,脚本里读相对路径配置文件必然读错,脚本开头 cd 到固定目录或全部用绝对路径。
第三,查输出去向:cron 默认把输出发邮件,没配邮件就等于丢日志,做法是每条任务都重定向到日志文件,标准输出和标准错误分开记,失败时先看日志再猜。
第四,查权限与 shell:脚本在交互 shell 下靠 .bashrc 里的别名和函数,cron 用非交互 shell 不加载它们,把依赖写进脚本本身;另外检查脚本可执行权限和属主。
第五,查时间与时区:服务器时区、夏令时、crontab 表达式里的星期与日期是“或”关系,这些都容易让任务在“以为的时间”之外跑,先用一分钟后的一次性任务验证链路。
你遇到过最隐蔽的 cron 静默失败是什么原因?欢迎分享。