Как да убия процес на отдалечен сървър с помощта на 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
Всъщност не е отговор на въпроса ви, но обмисляли ли сте да използвате плат вместо това? Това прави използването на paramiko много по-лесно :)   -  person Wolph    schedule 03.02.2014
comment
Трябва да спомена, че потребителят има root права. Това всъщност е лошо според мен. Може да има подходящи sudo привилегии, но бих го сметнал и за опасно. В този контекст мисля, че не е необходима специална власт, тъй като на потребителя е позволено да убива процеси, които притежава. Поне на всяка Linux система, върху която съм работил. Опитвали ли сте да издадете еквивалентна ssh дистанционна команда от друга система на ръка (нещо като ssh name@remote "kill pid")? Средата, настроена за интерактивен ssh и неинтерактивен, се различават малко от приемащия край. Може да се окаже, че не е свързано с python.   -  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
Не използвайте shell, освен ако не е абсолютно необходимо, exec_command е много по-лесен за разсъждение. Все още не извиквате get_pty на същия канал като invoke_shell. Ако командата exec_command е неуспешна и трябва да се свържете отново, тогава нещо друго се е объркало; проверете вашите регистрационни файлове.   -  person JimB    schedule 04.02.2014
comment
@JimB, благодаря за бележките ти. Ще отстраня грешки в кода отново.   -  person Zeinab Abbasimazar    schedule 05.02.2014