У меня есть скрипт 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-соединение и тем самым убил процесс; это было успешно. Но я все еще ищу лучший способ.
sudo
привилегии, но я бы тоже счел это опасным. В этом контексте, я думаю, никаких особых полномочий не требуется, так как пользователю разрешено убивать процессы, которыми он владеет. По крайней мере, на каждой Linux-системе, над которой я работал. Вы пытались выполнить эквивалентную удаленную командуssh
из другой системы вручную (что-то вродеssh name@remote "kill pid"
)? Среда, настроенная для интерактивного ssh и неинтерактивного, немного отличается на принимающей стороне. Это может оказаться не связанным с питоном. - person luk32   schedule 03.02.2014fabric
раньше, но этого недостаточно для моей программы. Есть некоторые ограничения, которые мешают моей работе. - person Zeinab Abbasimazar   schedule 03.02.2014exec_command
? Кроме того, «SSHClient сейчас не активен». означает, что вы используете устаревший транспорт. Получите транспорт от вашего текущего соединения. - person JimB   schedule 04.02.2014Exception paramiko.SSHException: SSHException('SSH session not active',)
. Но спасибо за указание на несвежий транспорт. Я создал новое временное SSH-соединение, и оно успешно завершило процесс; но я все еще за лучший способ сделать это, вы ничего не имеете в виду? - person Zeinab Abbasimazar   schedule 04.02.2014