Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > popen2.Popen4


Автор: cvetik 11.1.2009, 15:02
Всем привет!
Столкнулась вот с какой задачей.
Необходимо запустить процесс, который будет работать определенное время. По истечению этого времени необходимо в случае его зависания убить процесс.
Для этого необходим pid процесса.
Я решила сделать так:
Код

pipe=popen2.Popen4('ffmpeg ...')
pid = pipe.pid
...

try:
                        os.kill(pid, signal.SIGTERM)
                        os.kill(int(pid)+1, signal.SIGTERM)


Проблема вся в том, что при такой реализации запускаются два процесса

39324  p2  I+     0:00,05 /bin/sh -c ffmpeg ...

39325  p2  R+     0:00,32 ffmpeg ...

При этом pid = pipe.pid возвращет pid первого процесса. А нужно убивать при этом их оба. Как это можно сделать? Можно ли как-то обойти процесс /bin/sh и запускать только один ffmpeg?

Автор: aspolyakov 11.1.2009, 17:24
Я считаю что у вас в беше запускается ffmpeg, что видно из аргументов беша. Убивать мне кажется надо беш и вместе с ним убьется и ffmpeg(те os.kill(pid, signal.SIGTERM)), так как он привязан к нему. Что происходит при выполнении следующего??:
Код

os.kill(pid, signal.SIGTERM)

А вот при выполнении:
Код

os.kill(int(pid)+1, signal.SIGTERM)

у вас убивается какой-то случайный процесс... или я что-то непонимаю?
У меня на питоне 2.5.2 
Цитата

popen2.Popen4
 вобще не работало, у меня 
Цитата

popen2.popen4

Автор: cvetik 11.1.2009, 17:33
Если убить процесс /bin/sh ffmpeg ... , то второй процесс продолжает работать. При выполнении popen2.Popen4() генерируется два процесса, как я уже писала...По моим наблюдениям их pid'ы идут последовательно. Но это всего лишь закономерность. pipe.pid возвращает pid процесса /bin/sh  а надо убивать второй процесс, в лучшем случае оба.

Первое, что пришло на ум - обойти запуск команды с шелом.. то есть чтобы ffmpeg запускался сразу без запуска шела, следовательно тогда будет один процесс, и pipe.pid будет относиться именно к нему. Как можно это сделать? Или стоит для этих целей вообще какой-то другой метод использовать?

Автор: aspolyakov 11.1.2009, 17:51
Может в мане к бешу порутся, чтобы он за собой тянул ffmpeg. А в help() питона что есть про этот вопрос:
Цитата

popen2.popen4 = popen4(cmd, bufsize=-1, mode='t')
    Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' may
    be a sequence, in which case arguments will be passed directly to the
    program without shell intervention (as with os.spawnv()). If 'cmd' is a
    string it will be passed to the shell (as with os.system()). If
    'bufsize' is specified, it sets the buffer size for the I/O pipes. The
    file objects (child_stdout_stderr, child_stdin) are returned.


Добавлено через 3 минуты и 24 секунды
а попробуйте:
Код

pipe=popen2.Popen4('/bin/sh -c ffmpeg')

Автор: cutwater 12.1.2009, 02:09
Вообще странно, что если убить shell ffmpeg продолжает работать, это ж дочерний процесс должен быть.  Соответственно если убить родительский процесс, завершаются и все дочерние.

Автор: aspolyakov 12.1.2009, 18:25
Я тогоже мнения, а вот если сделать /bin/sh -c ffmpeg, тогда наверняка должен убится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)