Ubuntu服务器Crontab定时任务无法正常执行问题求助
Ubuntu服务器Crontab定时任务无法正常执行问题求助
问题描述
我是Ubuntu Server的新手,这周在配置crontab定时任务时遇到了大麻烦,试了各种方法都没解决,实在摸不着头脑了。
我写了一个脚本,功能是检测SSH无活动一段时间后自动关机。手动运行脚本完全正常,但用crontab定时执行就没反应了。
以下是我的脚本代码:
#!/bin/bash set -o nounset -o errexit -o pipefail MARKER_FILE="/tmp/ssh-inactivity-flag" STATUS=$(netstat | grep ssh | grep ESTABLISHED &>/dev/null && echo active || echo inactive) if [ "$STATUS" == "inactive" ]; then if [ -f "$MARKER_FILE" ]; then echo "Powering off due to ssh inactivity." rm --force "$MARKER_FILE" /sbin/poweroff else echo "El cabron aun no se ha ido :(" touch "$MARKER_FILE" fi else rm --force "$MARKER_FILE" echo "No se va el pussi" fi
我的crontab设置:
*/1 * * * * root /home/angel/idle.sh
从/var/log/syslog里能看到cron确实执行了脚本,但就是没效果,也看不到脚本的输出:
Jun 29 13:37:01 torreon CRON[1951]: (angel) CMD (root /home/angel/idle.sh)
而且我试了其他只有一行代码的简单脚本,用crontab执行也不行,求各位大神指点!
问题排查与解决方案
我帮你梳理几个crontab最容易踩的坑,你可以逐一排查:
- Crontab语法错误(最可能的原因)
普通用户的crontab条目不需要指定用户,只有系统级的/etc/crontab才需要写用户字段。你现在的crontab里多了root,导致cron把整个root /home/angel/idle.sh当成了要执行的命令,自然跑不起来。
解决方法:
- 如果要以普通用户
angel身份运行,直接改成:*/1 * * * * /home/angel/idle.sh - 如果必须以root身份运行,不要在
angel的crontab里加root,而是用sudo crontab -e编辑root用户的定时任务,然后写入:*/1 * * * * /home/angel/idle.sh
- 脚本权限问题
确保脚本有可执行权限,执行以下命令:
chmod +x /home/angel/idle.sh
- 命令绝对路径问题
Cron的环境变量PATH非常有限,很多命令可能找不到(比如netstat)。你可以先查一下命令的绝对路径:
which netstat
然后把脚本里的netstat替换成查到的绝对路径(比如/usr/bin/netstat)。
- 捕获脚本执行日志
把脚本的输出和错误信息重定向到日志文件,方便排查问题。修改crontab条目:
*/1 * * * * /home/angel/idle.sh >> /var/log/idle_script.log 2>&1
之后查看/var/log/idle_script.log就能看到脚本执行时的具体错误了。
- 环境变量缺失
如果脚本依赖某些环境变量,cron默认的环境可能没有。可以在脚本开头添加环境变量配置:
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 后面的脚本内容不变
按上面的步骤排查,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者Ángel
相关产品推荐
相关产品推荐

