Как убить процесс на удаленном сервере с помощью python paramiko

У меня есть скрипт Python, который подключается к удаленному серверу с операционной системой Lenny. Он запускает процесс в фоновом режиме, используя следующую строку:

shell.send("cd /my/directory/; nohup ./exec_name > /dev/null 2>&1 &\n")

Затем после некоторых других кодов он отправляет на сервер команду kill, чтобы остановить выполнение процесса; вот код:

shell.send("kill -9 process_pid \n")

Он не возвращает ошибки, но не убивает процесс, и он все еще жив в системе. Я также пробовал killall -9 process_name, но получил тот же результат. Любая помощь?

Для получения дополнительной информации, вот код для подключения к серверу:

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()

Я должен упомянуть, что пользователь имеет привилегии root.

ИЗМЕНИТЬ 1:

Я забыл сказать, что я пробовал это:

ssh.exec_command("kill -9 process_pid \n")

Но он вернул эту ошибку:

SSHClient is not active right now.

Редактировать 2:

Как упоминалось в комментарии @JimB, проблема с exec_command заключается в том, что транспорт устарел. Я установил временное SSH-соединение и тем самым убил процесс; это было успешно. Но я все еще ищу лучший способ.


person Zeinab Abbasimazar    schedule 03.02.2014    source источник
comment
Но вы отправляете реальный идентификатор процесса, верно? Не строка «process_pid»?   -  person Wolf    schedule 03.02.2014
comment
Я так думаю, но позвольте мне перепроверить!   -  person Zeinab Abbasimazar    schedule 03.02.2014
comment
Да, на самом деле это настоящий идентификатор процесса.   -  person Zeinab Abbasimazar    schedule 03.02.2014
comment
На самом деле это не ответ на ваш вопрос, но вы не рассматривали возможность использования ткани? Это значительно упрощает использование парамико :)   -  person Wolph    schedule 03.02.2014
comment
Я должен упомянуть, что пользователь имеет привилегии root. Это на самом деле плохо, я думаю. У него могут быть соответствующие sudo привилегии, но я бы тоже счел это опасным. В этом контексте, я думаю, никаких особых полномочий не требуется, так как пользователю разрешено убивать процессы, которыми он владеет. По крайней мере, на каждой Linux-системе, над которой я работал. Вы пытались выполнить эквивалентную удаленную команду ssh из другой системы вручную (что-то вроде ssh name@remote "kill pid")? Среда, настроенная для интерактивного ssh и неинтерактивного, немного отличается на принимающей стороне. Это может оказаться не связанным с питоном.   -  person luk32    schedule 03.02.2014
comment
@Wolph, я пробовал fabric раньше, но этого недостаточно для моей программы. Есть некоторые ограничения, которые мешают моей работе.   -  person Zeinab Abbasimazar    schedule 03.02.2014
comment
@ luk32, я попытался установить SSH-соединение из другой системы и завершить процесс с помощью приведенной выше команды, и это было успешно.   -  person Zeinab Abbasimazar    schedule 03.02.2014
comment
@ZeinabAbbasi Вы неоднозначны. Вы вводили удаленную команду или использовали интерактивное соединение ssh? Существует (или может быть) небольшая разница между интерактивным и неинтерактивным режимом ssh.   -  person luk32    schedule 03.02.2014
comment
@ luk32, извините, может быть, я просто неправильно понял ваш комментарий. На самом деле я говорю об удаленной команде. Но я также пробовал интерактивное соединение SSH. Первое было неудачным, а второе успешным. Надеюсь, я был понятен.   -  person Zeinab Abbasimazar    schedule 03.02.2014
comment
Каков результат и exit_status exec_command? Кроме того, «SSHClient сейчас не активен». означает, что вы используете устаревший транспорт. Получите транспорт от вашего текущего соединения.   -  person JimB    schedule 04.02.2014
comment
@JimB, кода ошибки нет; точная фраза такова: Exception paramiko.SSHException: SSHException('SSH session not active',). Но спасибо за указание на несвежий транспорт. Я создал новое временное SSH-соединение, и оно успешно завершило процесс; но я все еще за лучший способ сделать это, вы ничего не имеете в виду?   -  person Zeinab Abbasimazar    schedule 04.02.2014
comment
Не используйте оболочку без крайней необходимости, exec_command гораздо проще рассуждать. Вы по-прежнему не вызываете get_pty на том же канале, что и invoke_shell. Если exec_command не работает, и вам нужно переподключиться, значит, что-то еще пошло не так; проверьте свои журналы.   -  person JimB    schedule 04.02.2014
comment
@JimB, спасибо за ваши заметки. Я буду отлаживать код снова.   -  person Zeinab Abbasimazar    schedule 05.02.2014