【案例分享】crontab执行脚本异常问题

很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了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会自动设置可构成最小环境的环境变量。


解决方案可以有两种:

1. 定义好一些环境参数,并在crontab里面先source生效,再执行主程序脚本

2. 直接把脚本中的环境变量改为绝对路径。


公众号-智能化IT系统。每周都有技术文章推送,包括原创技术干货,以及技术工作的心得分享。扫描下方关注。



猜你喜欢

转载自blog.csdn.net/weixin_42488570/article/details/80769097
今日推荐