欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-03-26 10:29:13
很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了crontab里面执行,结果,不管怎么配置,就是执行不正常。 结果发现环境问题,居然是这个异常的元凶。 我们先在我们的服务器上执行env命令,出现如下: 然后我们编辑一个crontab,如下: * * * * * e ......

很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了crontab里面执行,结果,不管怎么配置,就是执行不正常。

结果发现环境问题,居然是这个异常的元凶。

我们先在我们的服务器上执行env命令,出现如下:

 1 xdg_vtnr=1
 2 xdg_session_id=1
 3 hostname=bogon
 4 imsettings_integrate_desktop=yes
 5 gpg_agent_info=/run/user/0/keyring/gpg:0:1
 6 vte_version=3802
 7 term=xterm
 8 shell=/bin/bash
 9 xdg_menu_prefix=gnome-
10 histsize=1000
11 gjs_debug_output=stderr
12 windowid=37748743
13 gjs_debug_topics=js error;js log
14 imsettings_module=ibus
15 qt_graphicssystem_checked=1
16 user=root
17 ssh_auth_sock=/run/user/0/keyring/ssh
18 username=root
19 session_manager=local/unix:@/tmp/.ice-unix/1672,unix/unix:/tmp/.ice-unix/1672
20 path=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
21 mail=/var/spool/mail/root
22 desktop_session=gnome
23 qt_im_module=ibus
24 pwd=/root
25 xmodifiers=@im=ibus
26 lang=zh_cn.utf-8
27 gdm_lang=zh_cn.utf-8
28 kdedirs=/usr
29 gdmsession=gnome
30 ssh_askpass=/usr/libexec/openssh/gnome-ssh-askpass
31 histcontrol=ignoredups
32 home=/root
33 xdg_seat=seat0
34 shlvl=2
35 gnome_desktop_session_id=this-is-deprecated
36 xdg_session_desktop=gnome
37 logname=root
38 dbus_session_bus_address=unix:abstract=/tmp/dbus-vqpgyslpbo,guid=0b7c6ec0e15a92dd89a8eaf654f84153
39 lessopen=||/usr/bin/lesspipe.sh %s
40 windowpath=1
41 xdg_runtime_dir=/run/user/0
42 display=:0
43 xdg_current_desktop=gnome
44 xauthority=/run/gdm/auth-for-root-a4dlsi/database
45 _=/usr/bin/env

 

然后我们编辑一个crontab,如下:

* * * * * env > /home/crontab.out

 

然后我们在/home/crontab.out文件中,看看里面的内容。令人奇怪的是,我们发现的里面的信息只有

 1 xdg_session_id=3
 2 shell=/bin/sh
 3 user=root
 4 path=/usr/bin:/bin
 5 pwd=/root
 6 lang=zh_cn.utf-8
 7 shlvl=1
 8 home=/root
 9 logname=root
10 xdg_runtime_dir=/run/user/0
11 _=/usr/bin/env

 

我们先不讨论原因,这里,我们就可以看到为什么很多脚本在crontab中编辑后不可以运行了。因为crontab的任务环境就没有定义那么多的环境变量,我们在交互式的环境下写的脚本中用到了这些没有的环境变量,当然可以通过,但是放到crontab下就不行了。

 

那么这些环境变量居然差那么多,为什么呢?因为系统的cron deamon会自动设置可构成最小环境的环境变量。

 

解决方案可以有两种:

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

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