2014-10-01 4 views
1

Я запускаю скрипт python, который включает запуск фононного процесса «burnP6» на удаленной машине.Запустить фоновый процесс на удаленной машине с помощью python

Я пытался использовать ткань:

import fabric.api 
fabric.api.execute(run_burnP6_bg, hosts=[remote_machine]) 

def run_burnP6_bg(): 
    fabric.api.run("burnP6 &") 

Кроме того, я попытался с помощью SSH -f с подпроцесса:

import subprocess 

def cpu_load(receiver, load_percent='100', time_seconds='3'): 
    if 1<= load_percent and 100 >= load_percent: 
     cmd = 'ssh -f [email protected]{1} '.format(ip_addr) + "'burnP6 &'" 
     subprocess.call(cmd.split(' ')) 
    elif 0 == load_percent: 
     # No load to be added 
     pass 

Но оба они не работали. При запуске на удаленном сервере я не видел никакого процесса burnP6.

Есть что-то, что мне не хватает?

+0

попробуйте 'fabric.api.run (" (nohup burnP6 &) ")'. Для supbrocess используйте 'shlex.split()', а не 'str.split()'. Я подозреваю, что ваша команда не анализируется, как ожидалось. Используйте '-l user', а не' @ '. Используйте «disown -a» и «nohup» для продолжения работы даже после того, как терминал, который он использует, закрыт. В общем, сначала проверьте свою команду ssh, прежде чем пытаться вставить ее в python/fabric. –

+0

Спасибо. Ошибка заключалась в расщеплении. Мне нужно, чтобы мой список cmd был в форме: ['ssh', '-f', 'acelio', 'nohup burnP6 &'] – Akshya11235

ответ

3

Войти с помощью ssh и начать любой процесс работы с job&. Войдите в систему с помощью ssh в другом окне и выполните ps, чтобы проверить вашу работу: вы должны увидеть, что она работает. Теперь выйдите из своего первого ssh и снова проверьте свой процесс работы. Вы заметите, что теперь оно исчезло. Это происходит потому, что задания привязаны к терминалу по умолчанию и отправляются SIGHUP, когда терминал закрыт.

Теперь повторите этот процесс с запуском nohup job& или disown job&. Это предотвращает убийство процесса SIGHUP.

Чтобы исправить код, который вы можете использовать одно из следующих действий:

import fabric.api 
fabric.api.execute(run_burnP6_bg, hosts=[remote_machine]) 

def run_burnP6_bg(): 
    fabric.api.run("nohup burnP6 &") 

или с подпроцессом

import subprocess 
cmd = 'ssh -f [email protected]{1} '.format(ip_addr) + "'nohup burnP6 &'" 
subprocess.call(cmd,shell=True) 

это должно предотвратить работу от смерти, когда SSH сессия заканчивается.

+0

Я думаю, что использование split было бы неправильным, как я заметил в комментарии к вопросу. Но да, иначе с тканью, это сработало. Спасибо – Akshya11235

+0

Да, извините за второй пример не работает. Я отредактирую. –

+1

это действительно не работает, вы должны хотя бы использовать 'pty = false' –

Смежные вопросы