案例分享 crontab執行指令碼異常問題

2022-08-27 19:12:07 字數 2432 閱讀 5878

很多時候我們會遇見這種情況,我們千辛萬苦寫了乙個指令碼,經過測試,一切正常,然後放到了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

* * * * * 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. 直接把指令碼中的環境變數改為絕對路徑。

crontab執行指令碼出錯

最近經常碰到關於crontab不能執行的,初步總結了有以下幾個原因 第一,指令碼的原因 大多數情況下,是我們的指令碼的問題,這種問題導致crontab不能執行的概率佔到70 以上。因為程式執行到某一步導致crontab終止執行,如,資料庫訪問出錯等。第二,執行環境問題,當我們碰到第一情況下,一般都可...

crontab計畫執行指令碼詳解

crontab是linux系統中在固定時間執行某乙個程式的工具,類似於windows系統中的任務計畫程式。一 安裝crontab yum install vixie cron 安裝 chkconfig crond on 設為開機啟動,安裝chkconfig yum installchkconfig ...

crontab 執行指令碼注意的問題

bin bash filepath cd dirname 0 pwd filename excute pro cd pid ps ef grep filename grep v grep awk pidnum echo pid wc awk export ld library path lib us...