【Case Sharing】Crontab Execution Script Abnormal Problem

Many times we will encounter this situation. We have worked hard to write a script. After testing, everything is normal, and then put it into crontab to execute. As a result, no matter how it is configured, the execution is abnormal.


It turned out that environmental problems were actually the culprit of this anomaly.


We first execute the env command on our server, which appears as follows:

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系统。每周都有技术文章推送,包括原创技术干货,以及技术工作的心得分享。扫描下方关注。



Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324491332&siteId=291194637