【案例分享】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系統。每周都有技術文章推送,包括原創技術干貨,以及技術工作的心得分享。掃描下方關注。
總結
以上是生活随笔為你收集整理的【案例分享】crontab执行脚本异常问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【团队管理】改造团队成员?
- 下一篇: 通过Erlang构建TCP服务器