2015-05-04 178 views
0

我有一個bash腳本集用於從遠程驅動器複製備份;如果我從終端運行它,這個腳本工作正常,即$ ./getBackup;但是,如果我嘗試將其放入我的crontab中,則不起作用。Bash腳本獨立工作,不會在crontab中工作

我已經通過了一堆的問題在這裏/答案的閱讀,包括

也許我錯過了什麼,但我想我已經嘗試了那些提供的大部分建議,以及我能想到的所有其他建議。我試圖從/ etc/crontab中的crontab中,從sudo crontab中運行它;我已經檢查過終端的env(腳本手動工作的位置)並將其放入cron作業的腳本中。

任何人有任何想法?

[編輯添加] 一些評論要求有問題的代碼,所以:

的crontab:

30 9 * * * /home/opsmonitor/Documents/getBackup 

getBackup

cd /home/opsmonitor/Documents/ 
OF=backup-$(date +%Y%m%d) 
echo "Retrieving backup file $OF" 
scp [email protected] ADDRESS HERE://opt/backups/backupsbydate/$OF.tgz $OF.tgz 

正如我所說的,getBackup作品從命令行罰款;並從crontab運行,它不會執行任何操作。 (現在我將輸出重定向到一個文件,echo會打印到該文件。)

由於scp從命令行運行,我認爲這是一個環境問題,但正如我所說的,我添加了很多腳本中的env變量 - 它仍然可以在命令行中正常運行,並從crontab失敗。

+2

將你的'cron'條目添加到問題中。 – heemayl

+0

'getBackup'腳本的內容也可能有用。你是否已經向腳本添加了明確的錯誤日誌記錄(對一個文件)以試圖在cron運行時看到發生了什麼? –

+0

即使OP使環境變量正確,腳本也可能嘗試使用/ dev/tty執行某些操作... –

回答

1

我通過在一個腳本中運行我的程序來測試環境方面,該腳本刪除了額外的環境變量。下面是一個例子(注意,它實際上離開PATH單獨—不正是你想要的):

#!/bin/sh 
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $ 
# trim the environment to minimal (PATH may still be long...) 
env | sed -e 's/=.*//' -e '/^[ ].*/d' | \ 
while true 
do 
    read value 
    if test -z "$value" ; then 
      # honor assignments to variables in the parameter list 
      while test $# != 0 
      do 
        case "x$1" in 
        *=*) 
          eval $1 
          name=`echo "$1"|sed -e 's/=.*//'` 
          export $name 
          shift 1 
          ;; 
        *) 
          break 
          ;; 
        esac 
      done 
      exec "[email protected]" 
      break 
    fi 
    case "$value" in 
    HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME) 
      ;; 
    *\ *|*\(*|*\)*|*\!*) 
      #echo "...skipping $value" 
      ;; 
    *) 
      #echo value:"$value" 
      unset "$value" 
      ;; 
    esac 
done 

並調用noenv,會做

noenv ./getBackup 

但是,如果你的程序仍然作品如果從命令行正確執行,我會懷疑它嘗試使用/dev/tty等,如果找不到終端,則會失敗。這是cron不太常見的問題,但在例如Linux: Difference between /dev/console , /dev/tty and /dev/tty0中有說明。