Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> popen2.Popen4 
:(
    Опции темы
cvetik
Дата 11.1.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Всем привет!
Столкнулась вот с какой задачей.
Необходимо запустить процесс, который будет работать определенное время. По истечению этого времени необходимо в случае его зависания убить процесс.
Для этого необходим 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?
PM MAIL   Вверх
aspolyakov
Дата 11.1.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg

Репутация: нет
Всего: нет



Я считаю что у вас в беше запускается 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


Это сообщение отредактировал(а) aspolyakov - 11.1.2009, 17:43
PM MAIL WWW ICQ Skype   Вверх
cvetik
Дата 11.1.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



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

Первое, что пришло на ум - обойти запуск команды с шелом.. то есть чтобы ffmpeg запускался сразу без запуска шела, следовательно тогда будет один процесс, и pipe.pid будет относиться именно к нему. Как можно это сделать? Или стоит для этих целей вообще какой-то другой метод использовать?
PM MAIL   Вверх
aspolyakov
Дата 11.1.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg

Репутация: нет
Всего: нет



Может в мане к бешу порутся, чтобы он за собой тянул 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')

PM MAIL WWW ICQ Skype   Вверх
cutwater
Дата 12.1.2009, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



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


--------------------
user posted image
PM MAIL   Вверх
aspolyakov
Дата 12.1.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg

Репутация: нет
Всего: нет



Я тогоже мнения, а вот если сделать /bin/sh -c ffmpeg, тогда наверняка должен убится.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.