2010-09-14 7 views
1

Я выполнения процесса SSH так:Что происходит с моим процессом?

checkIn() 
sshproc = subprocess.Popen([command], shell=True) 
exit = os.waitpid(sshproc.pid, 0)[1] 
checkOut() 

Важно, что форма процесса checkIn() и checkOut() действия до и после этих строк кода. У меня есть тестовый пример, который включает в себя то, что я выхожу из сеанса SSH, закрывая окно терминала вручную. Конечно, моя программа работает некорректно и checkOut() никогда не вызывается в этом случае. Может ли кто-нибудь дать мне указатель на то, что я могу найти, чтобы исправить эту ошибку?

Сообщите мне, если какая-либо другая информация будет полезна.

Спасибо!

ответ

1

Процесс Python обычно выполняется в том же окне, что и подпроцесс ssh, и поэтому должен быть прекращен так же резко, когда вы закрываете это окно, - прежде чем получить возможность выполнить checkOut. Чтобы убедиться, что функция вызывается при выходе программы (хотя для достаточно-крутых окончаний, в зависимости от вашей ОС, не может быть никаких гарантий), попробуйте стандартный библиотечный модуль Python atexit.

+0

Очень чистый модуль, но не решил проблему. Спасибо вам за публикацию! – sholsapp

+1

@gnucom, если вам нужно обеспечить выполнение некоторого кода, когда ваш процесс завершается очень резко (в худшем случае, с помощью 'kill -9' ... или даже ошибки HW!), Вам необходимо по определению выполнить этот код в процессе _separate_ («демон») - «сторожевой таймер», который ничего не делает, кроме как ждать выхода из строя основного процесса и, если и когда это произойдет, запускает указанный код. Быть в другом процессе, конечно, означает архитектурные ограничения на то, что вы можете и чего не можете сделать, но (для достаточно резких завершений) это единственная игра в городе :-(. –

+0

спасибо за дизайнерское предложение. Я думаю, это то, что я буду в конце концов, потому что 'kill -9' по сути является тестовым примером, с которым я застрял. – sholsapp

1

Возможно, все, что вам нужно, это блок try ... finally?

try: 
    checkIn() 
    sshproc = subprocess.Popen([command], shell=True) 
    exit = os.waitpid(sshproc.pid, 0)[1] 
finally: 
    checkOut() 

Если система падает, процесс получает SIGKILL и т.д., checkOut() следует.

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