Уведомления

Группа в Telegram: @pythonsu

#1 Июль 12, 2007 12:43:30

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Довольно глупый вопрос, но никак не могу понять как это делается.
В одном скрипте, нужно в фоне запустить другой скрипт, который кое чего поделает и так же запустит пару программ (ffmpeg например). Пишу os.system(“python script2.py &”), но первый скрипт всё равно встаёт, дожидаясь выполнения второго. :(



Офлайн

#2 Июль 12, 2007 13:38:15

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

попробуй через нити



Офлайн

#3 Июль 12, 2007 14:05:47

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

В самом простом случае это можно сделать так:

#!/usr/bin/python
import os
if os.fork() == 0:
    if os.fork() == 0:
        os.execl('/bin/sleep', 'sleep', '10')
Если же надо периодически запускать на выполнение какие-то команды из демона, то надо будет еще организовать сборку зомби с помощью os.wait()



Офлайн

#4 Июль 12, 2007 14:32:50

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Запуск процесса в фоне

Эээ… А зачем fork 2 раза? Мне обычно одного хватало :)



Офлайн

#5 Июль 12, 2007 14:40:58

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Андрей Светлов
Эээ… А зачем fork 2 раза? Мне обычно одного хватало smile
Привычка :) 2 надо если демонизируешь процесс(http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012), а так действительно одного хватит.



Офлайн

#6 Июль 12, 2007 14:51:44

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Хм. Работает, но не совсем так как надо…

import os
if os.fork() == 0:
	os.execl("/usr/bin/python", "convert", "/path/convert.py", "65", "/path/file.wmv", "/path/file.wmv.flv")
print "test"

$ python test.py
test
$ FFmpeg version SVN-rUNKNOWN, Copyright © 2000-2007 Fabrice Bellard, et al. (и дальше вывод ffmpeg).

Пробовал добавить к аргументам “>”, “/dev/null”. Не помогает.

А django (это её view первый скрипт) вообще падает после этого. :(



Офлайн

#7 Июль 12, 2007 15:14:39

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Cyxapeff
Пробовал добавить к аргументам “>”, “/dev/null”. Не помогает.
'> /dev/null' - обрабатывает shell. os.execl - сразу загружает новую программу в текущий процесс и не вызывает командный интерпритатор.
Как перенаправить вывод описано в комментах к ‘рецепту’(см. ссылку в моем предыдущем посте)



Офлайн

#8 Июль 12, 2007 15:56:54

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Спасибо. Тестовый скрипт работает как надо, а вот django всё равно ждёт завершения процесса. :(
Но я думаю этот вопрос надо задавать не сюда.



Офлайн

#9 Июль 12, 2007 23:32:10

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

если кому интересно, то всё отлично работает в связке apache2+django. А вот на встроенном сервачке не хочет. Ну и ладно. )



Офлайн

#10 Июль 12, 2007 23:44:03

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск процесса в фоне

Cyxapeff
если кому интересно, то всё отлично работает в связке apache2+django. А вот на встроенном сервачке не хочет. Ну и ладно. )
Сталкивался с похожей проблемой. Форкал cgi скрипт на питоне и дочерний процесс переводил в фоновый режим. При использовании стандартного mod_cgi сервер всегда ожидал завершения дочернего процесса или убивал его по таймауту. Проблема заключалась в самом mod_cgi и решилась путем перехода на mod_python.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version