2015-01-21 106 views
0

我將包含要獲取的變量的文件路徑作爲參數傳遞給我的Bash腳本。 該文件是在Windows上創建的,以防有什麼區別。執行Cron作業沒有「看到」文件

下列檢查:

CONFIG_FILE=$1 
if [[ -f ${CONFIG_FILE} ]]; then 
    echo "Is a file" 
    . ${CONFIG_FILE} 
else 
    echo "Not a file" 
fi 

當我手動運行該腳本,在命令行中,檢查是好的,變量會馬上來源。

然而,當我設置使用

*/1 * * * * /full/path/to/script.sh /full/path/to/configfile 

cron作業,我得到「不是一個文件」打印出來。

我嘗試每一個設置我在網上找到解決這個:

  1. 設置都在crontab中和腳本本身的環境變量(PATH & SHELL)
  2. 採購輪廓(包括的/ etc /配置文件。/home/user/.bash_profile)都在crontab中(執行腳本之前)和腳本本身。
  3. 嘗試與-u用戶參數運行的crontab,但沒有權限爲這個(和它沒有任何意義,因爲我已經登錄的用戶誰應設置在crontab)

我正在設置腳本應該運行的正確用戶的crontab。用戶有權訪問文件的位置(可以通過從命令行運行腳本來觀察)。

尋找關於接下來可以嘗試什麼的進一步建議。

回答

0

發現另一個嘗試,它的工作。 我在cronjob行中添加了-q標誌。

*/1 * * * * /path/script.sh /path/config-file -q 

來源:Cron Job error "Could not open input file"

可有人請向我解釋這是什麼做的? 我不是很聰明bash。

+0

'-q'是'script.sh'的一個選項,我們無法弄清楚它在沒有訪問源的情況下做了什麼。 – tripleee 2015-01-21 12:21:04

+0

@tripleee,'-q'不相關,腳本從不解釋它。在cron行中,它只是確保配置文件參數不是行中的最後一個參數,所以這個文件參數沒有'\ r'。 – 2015-01-21 12:32:14

+0

@KarelKubat這是一個很好的猜測,但不過猜測。我們無法看到腳本的完整來源。 – tripleee 2015-01-21 12:59:36

1

你在做什麼是(我認爲)確保你的/path/config-file背後有一個單獨的論點。你原來的問題似乎是在Unix上,你的配置文件被表示爲/path/config-file\r(注意尾部\ r)。你正在通過添加一個參數-q\r這樣做,以便配置文件本身是「乾淨的」回車。您可以爲此添加blabla\r而不是-q\r。你的腳本不會解釋額外的參數;但是如果你把它放在cron行上,那麼你的配置文件參數是「受保護的」,因爲它後面有東西,就是這樣。

你也可以做的是確保你的cron定義是Unix風格(\n終止行)而不是DOS風格(\r\n終止行)。你的Unix機器上可能有一個實用程序dos2unix來完成這個任務。

或者您可以使用crontab -r刪除Unix上的crontab,然後使用crontab -e重新創建crontab。不要上傳在MS-DOS(或派生)上創建的文件。

+0

我已經在腳本中「清理」了回車變量的變量(我之前遇到過源變量的類似問題),所以我現在在測試它之前將它應用於CONFIG_FILE變量,並且它可以工作(沒有-q標誌)。感謝您的洞察! – dbu 2015-01-21 12:52:08