zoukankan      html  css  js  c++  java
  • 【案例分享】crontab执行脚本异常问题

    很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了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. 直接把脚本中的环境变量改为绝对路径。

  • 相关阅读:
    信息增益(Information Gain)(转)
    数据挖掘潜规则zz
    Google AdWords 广告排名首选项
    看图说话:关于BI那点事儿
    BI实施的四个层次
    10个有用的数据可视化资源
    数据可视化六步法
    数据仓库构建步骤
    关于javascript中对浮点加,减,乘,除的精度分析
    AMD规范与CMD规范的区别
  • 原文地址:https://www.cnblogs.com/xtary/p/9523383.html
Copyright © 2011-2022 走看看