2014-01-25 66 views
0

我有一個執行sh腳本的cronjob。該腳本還執行以下python腳本:Cron執行一個執行python腳本的sh腳本

#!/usr/bin/python 

print "Running python script" 
LANG = "en_US.UTF-8" 
import sys 
py3 = sys.version_info[0] > 2 
u = __import__('urllib.request' if py3 else 'urllib', fromlist=1) 
exec(u.urlopen('http://status.calibre-ebook.com/linux_installer').read()) 
print "installing" 
main(install_dir='/opt') 

然而,main(install_dir='/opt')不cron什麼時候執行,執行的Python腳本的sh腳本執行。如果我手動運行sh腳本,則Python腳本中的main(install_dir='/opt')會執行,因爲它應該如此。

爲什麼?

+0

我也試過'#/ usr/bin/env python',但無濟於事。 – Geremia

+0

我仍然得到這個錯誤:'2014-03-07 00:00:06 URL:https://raw.github.com/kovidgoyal/calibre/master/setup/linux-installer.py [24956/24956] - > 「 - 」[1] 安裝到/ opt /口徑 下載壓縮包安全簽名... 回溯(最近通話最後一個): 文件 「」,1號線,在 文件 「」,線路637,在主 文件 「」,線610,在download_and_extract 文件 「」,線321,在download_tarball 文件 「」,線路259,在do_download 文件 「」,線路206,在打印 TypeError:encode()參數1必須是字符串,而不是None' – Geremia

回答

1

任何時候腳本的運行方式都不同於cron,而不是命令行,首先要檢查的是用戶的權限,包括對用戶PATH的任何依賴或設置到登錄會話中的其他任何內容(通過~/.bashrc或同等的),這可能不是在非登錄會話中設置的。

每種情況下使用的是哪個用戶ID?典型地,「你」用於命令行,root用於cron,但取決於你在cron腳本中使用的其他決策/配置,如su

echo $(whoami)添加到您的腳本以查看正在使用哪個用戶ID,然後通過命令行運行腳本,但通過su root或任何用戶標識適用,並查看您是否有同樣的問題。迴應(pwd)以查看當前目錄是否爲您所期望的。轉儲完整env並查看PATH和其他環境變量是否符合您的期望。

通常對於cron作業,應該在cron作業腳本本身明確設置這些東西。依賴於用戶的環境以及令人困惑的登錄/非登錄問題,往往會導致無形的錯誤。

+0

在兩種情況下,它都由相同(非根)用戶運行。我正在使用我的用戶,非root用戶的crontab來執行sh腳本。 – Geremia

+0

當前目錄可能存在問題?您是否在腳本開始時嘗試了明確的'cd'? –

+0

Python腳本運行良好,除了最後一行,所以這似乎是一個Python問題,或者你的意思是在Python腳本中添加一個'cd'?那可能嗎? – Geremia

0

這是在後續版本中修復的Caliber中的一個錯誤。