从crontab运行时,subprocess.popen似乎失败了

时间:2010-09-23 16:01:56

标签: python cron subprocess popen

我正在运行一个来自crontab的脚本,它只是ssh并运行一个命令并将结果存储在一个文件中。

似乎失败的功能是subprocess.popen

这是python函数:

def _executeSSHCommand(sshcommand,user,node):

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

    sshunixcmd = '/usr/bin/ssh %s@%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)

我会盲目地试图找到我错误的地方。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

cron PATH非常有限。您应该设置ssh / usr / bin / ssh的绝对路径,或者将PATH设置为crontab中的第一行。

答案 1 :(得分:2)

您可能需要传递ssh -i参数告诉ssh使用特定的密钥文件。问题是您的环境未设置为告诉ssh使用哪个密钥。

你在这里使用python的事实是一个红色的鲱鱼。

答案 2 :(得分: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 :(得分:0)

当从cron运行python脚本时,环境PATH可能是一个挂断,如user1652558指出的那样。

要使用示例代码扩展此答案,以将自定义PATH值添加到环境中以进行subprocess调用:

import os
import subprocess

#whatever user PATH values you need
my_path = "/some/custom/path1:/some/custom/path2"

#append the custom values to the current PATH settings
my_env = os.environ.copy()
my_env["PATH"] = my_path + ":" + my_env["PATH"]

#subprocess call
resp = subprocess.check_output([cmd], env=my_env, shell=True)