Debian 12下root用户Cron脚本无法运行的排查求助
问题
在Debian 12服务器上测试一个仅向文件写入一行内容的简单Cron脚本:
- 普通用户执行
crontab -e配置时,脚本运行正常; - 需以root身份运行,尝试
sudo crontab -e、将脚本放入/etc/cron.d、sudo crontab -e -u root等方式配置后,脚本均未产生预期效果; /var/log无错误日志,仅在journal中找到如下日志:
Jan 26 09:45:01 server-1 cron[607]: (root) RELOAD (crontabs/root) Jan 26 09:45:01 server-1 CRON[15437]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0) Jan 26 09:45:01 server-1 CRON[15441]: (root) CMD (/bin/bash -c "/tmp/test.sh") Jan 26 09:45:01 server-1 CRON[15439]: (CRON) info (No MTA installed, discarding output) Jan 26 09:45:01 server-1 CRON[15439]: pam_unix(cron:session): session closed for user root
排查与解决步骤
从日志可知,root的cron已触发脚本执行(CMD (/bin/bash -c "/tmp/test.sh")),问题出在脚本执行过程中,按以下步骤排查:
检查脚本权限与内容
- 确保脚本有可执行权限:执行
chmod +x /tmp/test.sh - 脚本开头必须指定shell解释器,比如第一行写
#!/bin/bash - 脚本中所有路径用绝对路径:比如写入文件不要写
test.txt,要写/tmp/test.txt(cron默认工作目录是root的家目录/root,相对路径会写到这里)
- 确保脚本有可执行权限:执行
捕获脚本执行日志
修改cron任务,把输出和错误重定向到日志文件,就能看到具体报错:# 编辑root的crontab sudo crontab -e # 替换原有任务为(以每分钟执行为例) * * * * * /bin/bash /tmp/test.sh >> /tmp/root_cron_log.log 2>&1等待一分钟后查看
/tmp/root_cron_log.log,里面会有脚本执行的输出或错误信息。检查环境变量问题
cron的环境变量比交互式shell少很多,脚本中用到的命令如果不是系统内置命令(如echo),必须写绝对路径,比如/usr/bin/date而非date;或者在脚本开头导入环境变量:#!/bin/bash source /etc/profile # 后续脚本内容/etc/cron.d配置格式检查(如果用此方式)
/etc/cron.d下的任务文件必须严格遵循格式:分 时 日 月 周 执行用户 命令,比如:* * * * * root /tmp/test.sh必须明确指定
root用户,否则cron会以默认用户执行,导致权限问题。检查/tmp目录权限
执行mount | grep /tmp查看/tmp是否挂载了noexec选项,如果有,脚本无法在/tmp执行,需将脚本移至其他目录(如/usr/local/bin)。
内容的提问来源于stack exchange,提问作者gbos
相关产品推荐
相关产品推荐

