1. 程式人生 > >由crontab執行expect指令碼問題引發的--crontab環境變數問題

由crontab執行expect指令碼問題引發的--crontab環境變數問題

   手頭上有一個遠端重啟目標伺服器上程序的expect指令碼,SHELL下單獨執行時一切都OK,但是新增到cron任務中時執行卻不能工作。部分程式碼如下: 

expect指令碼:(/data/home/restart_expect)

      #!/usr/bin/expect

      #expect "*root's password*"
      expect "*Tencent:*"

      send "sh some remote scripts"
      send "exit/n"

      expect eof exit 0

crontab任務:

      */5 * * * * /data/monitor/new_itil_dicts/syn_tcms_data/run_syn.php /tmp/test.log 2>/dev/null

shell下單獨執行一切沒有問題,放到cron中卻不行,開始定位問題。以下是整個過程:

1. 首先修改crontab的任務錯誤輸出到一個執行檔案

      */5 * * * * /data/monitor/new_itil_dicts/syn_tcms_data/run_syn.php /tmp/test.log 2>&1

2.檢視檔案/tmp/test.log上的錯誤輸出提示如下

       找不到命令 ssh,這就讓我有點納悶,為啥會找不到 ssh命令(我裝在/usr/local/bin目錄下)呢,echo $PATH /usr/local/bin目錄明明就在PATH中,這時想到是不是cron用的環境變數和shell的不一樣,於是google之,發現cron在/etc/crontab中有如下內容:

       SHELL=/bin/sh
       PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
       MAILTO=root
      #
      # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
      #

注意這裡PATH變數發現ssh安裝目錄並不在這個上面,到這裡就知道原來是cron和shell使用不同的PATH變數導致的問題。所以解決辦法可以是:

1. 修改/etc/crontab的PATH變數,使包含expect中使用的命令如ssh

       SHELL=/bin/sh
       PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin:/usr/local/bin

       MAILTO=root

2. expect指令碼使用命令的完整路徑如,

       #!/usr/bin/expect

      #expect "*root's password*"
      expect "*Tencent:*"

      send "sh some remote scripts"
      send "exit/n"

      expect eof exit 0