2010-09-23 64 views
1

可能是一個愚蠢的問題,但在運行時失敗....subprocess.popen似乎從crontab中

我從crontab中運行一個腳本,只是ssh和運行一個命令,並將結果保存在一個文件中。

,這似乎是失敗的subprocess.popen

這裏的功能是功能

def _executeSSHCommand(sshcommand,user,node): 

    ''' 
    Simple function to execute an ssh command on a remote node. 
    ''' 

    sshunixcmd = '/usr/bin/ssh %[email protected]%s \'%s\'' % (user,node,sshcommand) 
    process = subprocess.Popen([sshunixcmd], 
           shell=True, 
           stdout=subprocess.PIPE, 
           stderr=subprocess.PIPE) 
    process.wait() 
    result = process.stdout.readlines() 
    return result 

當它在命令行中運行,它執行正確,從cron似乎無法與消息

這裏的crontab項 02 * * * * /home/matt/scripts/check-diskspace.py >> /home/matt/logs/disklog.log

這裏是錯誤

Sep 23 17:02:01 timmy CRON[13387]: (matt) CMD (/home/matt/scripts/check-diskspace.py >> /home/matt/logs/disklog.log) 
Sep 23 17:02:01 timmy CRON[13386]: (CRON) error (grandchild #13387 failed with exit status 2) 

我要盲目試圖找到確切的地方,我已經走錯了。

任何想法?

+0

您的ssh命令是否需要任何環境變量才能正常工作?請記住,cron在一個簡化的環境中運行作業,幾乎沒有默認定義的任何環境變量。 – unutbu 2010-09-23 16:05:56

+0

特別是,'ssh'實例如何進行身份驗證?如果您使用的是'ssh-agent',那麼您需要獲取傳播到cronjob環境中的必要環境變量。 – llasram 2010-09-23 16:09:32

+0

每當cron出錯時,我發現將stderr(在Popen命令和crontab項中)重定向到一個文件,以獲取有關失敗的更多線索。 – unutbu 2010-09-23 16:11:17

回答

1

您可能需要傳遞ssh -i參數以告訴ssh使用特定的密鑰文件。問題是你的環境沒有設置告訴ssh使用哪個鍵。

你在這裏使用python的事實是一個紅鯡魚。

+0

大家好,在閱讀完所有評論後,我懷疑這不是python *的事情,而是我對ssh和crontab的理解不夠。 – MattY 2010-09-23 16:26:57

+0

感謝大家的回答!我今天晚上會花點時間來填補這些知識空白! – MattY 2010-09-23 16:28:18

1

對於python中所有與ssh相關的東西,你可以考慮使用paramiko。使用它,下面的代碼應該做你想做的。

import paramiko 
client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.connect(node, username=user) 
stdout = client.exec_command(ssh_command)[0] 
return stdout.readlines() 
3

cron PATH非常有限。你應該將絕對路徑設置爲你的ssh/usr/bin/ssh,或者將PATH設置爲你的crontab中的第一行。