赞
踩
很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了crontab里面执行,结果,不管怎么配置,就是执行不正常。
小编经常遇到,在网上查找了很多,也问过很多人,都没有一个确切的说法。后来无意间发现了一个环境问题,居然是这个异常的元凶。
我们先在我们的服务器上执行env命令,出现如下:
XDG_VTNR=1 XDG_SESSION_ID=1 HOSTNAME=bogon IMSETTINGS_INTEGRATE_DESKTOP=yes GPG_AGENT_INFO=/run/user/0/keyring/gpg:0:1 VTE_VERSION=3802 TERM=xterm SHELL=/bin/bash XDG_MENU_PREFIX=gnome- HISTSIZE=1000 GJS_DEBUG_OUTPUT=stderr WINDOWID=37748743 GJS_DEBUG_TOPICS=JS ERROR;JS LOG IMSETTINGS_MODULE=IBus QT_GRAPHICSSYSTEM_CHECKED=1 USER=root SSH_AUTH_SOCK=/run/user/0/keyring/ssh USERNAME=root SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1672,unix/unix:/tmp/.ICE-unix/1672 PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin MAIL=/var/spool/mail/root DESKTOP_SESSION=gnome QT_IM_MODULE=ibus PWD=/root XMODIFIERS=@im=ibus LANG=zh_CN.UTF-8 GDM_LANG=zh_CN.UTF-8 KDEDIRS=/usr GDMSESSION=gnome SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass HISTCONTROL=ignoredups HOME=/root XDG_SEAT=seat0 SHLVL=2 GNOME_DESKTOP_SESSION_ID=this-is-deprecated XDG_SESSION_DESKTOP=gnome LOGNAME=root DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-VQpgyslPbO,guid=0b7c6ec0e15a92dd89a8eaf654f84153 LESSOPEN=||/usr/bin/lesspipe.sh %s WINDOWPATH=1 XDG_RUNTIME_DIR=/run/user/0 DISPLAY=:0 XDG_CURRENT_DESKTOP=GNOME XAUTHORITY=/run/gdm/auth-for-root-A4DlSi/database _=/usr/bin/env 然后我们编辑一个crontab,如下: * * * * * env > /home/crontab.out 然后我们在/home/crontab.out文件中,看看里面的内容。令人奇怪的是,我们发现的里面的信息只有 XDG_SESSION_ID=3 SHELL=/bin/sh USER=root PATH=/usr/bin:/bin PWD=/root LANG=zh_CN.UTF-8 SHLVL=1 HOME=/root LOGNAME=root XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/env
我们先不讨论原因,这里,我们就可以看到为什么很多脚本在crontab中编辑后不可以运行了。因为crontab的任务环境就没有定义那么多的环境变量,我们在交互式的环境下写的脚本中用到了这些没有的环境变量,当然可以通过,但是放到crontab下就不行了。
那么这些环境变量居然差那么多,为什么呢?因为系统的cron deamon会自动设置可构成最小环境的环境变量。
解决方案可以有两种:
在linux上需要监控网络的流量,在crontab里面设置的是每分钟执行一次,但是没达到自己想要的结果,分析过程如下:
1.查看/var/log/syslog发现有错误,info (No MTA installed, discarding output),意识到crontab的脚本没有把输出到日志
2.输出到日志后,发现sorry,I can not detect any network device,please report this issue to author.,这个错误是脚本里面打印的,说明其实是crontab是执行了
3.输出这个是找不到网卡,crontab里面找不到eth0,ifconfig这个写全路径后/sbin/ifconfig,这个错误消失了
4.错误在一步步减少,但是任然和预想的有差距,在脚本里面输出echo $PATH后发现:/usr/bin:/bin,但是其实正式的环境变量应该是:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
5.修改脚本,在顶部直接导入环境变量PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games,问题解决
参考链接 :
ubuntu crontab 不执行的解决方法 :http://ciika.com/2017/11/ubuntu-crontab-cannot-exec/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。