subprocess.popen, похоже, не работает при запуске из crontab - PullRequest
2 голосов
/ 23 сентября 2010

Я запускаю скрипт из 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 ]

4 голосов
/ 30 ноября 2012

cron PATH очень ограничен.Вы должны либо установить абсолютный путь к вашему ssh / usr / bin / ssh, либо установить PATH в качестве первой строки в вашем crontab.

2 голосов
/ 23 сентября 2010

Вам, вероятно, нужно передать ssh аргумент -i, чтобы указать ssh использовать определенный файл ключа. Проблема в том, что ваша среда не настроена для указания ssh, какой ключ использовать.

Тот факт, что вы используете Python здесь, является чем-то вроде красной сельди.

1 голос
/ 23 сентября 2010

Для всего, что связано с ssh в python, вы можете использовать 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()
0 голосов
/ 07 января 2019

При запуске сценариев Python из cron среда PATH может быть зависанием, как указывает пользователь 1652558.

Чтобы расширить этот ответ с примером кода, добавьте пользовательские значения 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)
...