2013-07-10 5 views
2

Мне сложно запустить процесс на фоне с помощью paramiko. Я использовал:Запуск процесса в фоновом режиме

stdin, stdout, stderr = ssh.exec_command('executefile.py &') 

и обнаружил, что процесс executefile.py не найден.

Затем я попытался с помощью другого способа, как в том числе обратной косой черты:

stdin, stdout, stderr = ssh.exec_command('executefile.py \&') 

Этот метод работал. Был экземпляр, работающий на машине, но не удивительно, что он не работал на заднем плане. Я мог бы узнать, так как он не работает на фоне, как когда код застрял во второй строке после этого кода. Это было

all_inf = stdout.readlines() 

Теперь код не выходил за пределы выше, если только процесс сценария не был убит.

Я изучаю paramiko, любая помощь приветствуется.

ответ

0

Я пробовал transport класс, и это было действительно здорово. Вот код, который я использовал:

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(hostname = "host_ip", username = "un"], password = "up") 
channel = ssh.get_transport().open_session() 
pty = channel.get_pty() 
shell = ssh.invoke_shell() 
shell.send("cd /my/directory/; nohup ./exec_name > /dev/null 2>&1 &\n") 

Но я до сих пор не знаю, как его убить, используя скрипты python; У меня есть открытый вопрос об этом here.

EDIT 1:

я решил мою проблему об убийстве процесс каким-то образом; вы можете проверить это.

3

exec_command не выполняет команду в интерактивной оболочке, поэтому «запуск процесса в фоновом режиме» на самом деле не имеет смысла.

Если вы действительно хотите сделать это, вы можете использовать команду nohup, чтобы начать свой процесс и сохранить его в живых, когда сеанс завершается. Помните, что вы не можете получить stdin, stdout или stderr, когда вы это делаете, поскольку вы отделяете процесс от оболочки, поэтому перенаправляйте их соответственно.

2

Вы можете попробовать:

stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &') 
+0

такой же на asyncssh – gzerone

2

Я перепробовал все методы, описанные здесь и here без успеха, и, наконец, понял, что нужно использовать каналы вместо использования SSHClient непосредственно для вызова exec_command (это не работает в фоновом режиме):

client = paramiko.SSHClient() 
client.connect(
    ip_address, username='root', pkey=paramiko_key, timeout=5) 
client.exec_command('python script.py > /dev/null 2>&1 &') 

Вы должны создать и использовать канал, это работает в фоновом режиме:

client = paramiko.SSHClient() 
client.connect(
    ip_address, username='root', pkey=paramiko_key, timeout=5) 
transport = client.get_transport() 
channel = transport.open_session() 
channel.exec_command('python script.py > /dev/null 2>&1 &') 

Так что nohup, dtach, screen и т. Д. На самом деле не нужны.

0

Вы можете попробовать использовать экран

screen -d -m ping 8.8.8.8 

Это будет начать экран и пинг 8.8.8.8.Вы можете просмотреть этот экран с помощью

screen -ls 

и прикрепить с помощью

screen -D <<screen_name>> 

Обратите внимание, что экран будет прекращено после того, как команда завершит выполнение.

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