Найти - Пользователи
Полная версия: Запуск процесса в фоне
Начало » Python для экспертов » Запуск процесса в фоне
1
Cyxapeff
Довольно глупый вопрос, но никак не могу понять как это делается.
В одном скрипте, нужно в фоне запустить другой скрипт, который кое чего поделает и так же запустит пару программ (ffmpeg например). Пишу os.system(“python script2.py &”), но первый скрипт всё равно встаёт, дожидаясь выполнения второго. :(
pythonwin
попробуй через нити
slivlen
В самом простом случае это можно сделать так:
#!/usr/bin/python
import os
if os.fork() == 0:
    if os.fork() == 0:
        os.execl('/bin/sleep', 'sleep', '10')
Если же надо периодически запускать на выполнение какие-то команды из демона, то надо будет еще организовать сборку зомби с помощью os.wait()
Андрей Светлов
Эээ… А зачем fork 2 раза? Мне обычно одного хватало :)
slivlen
Андрей Светлов
Эээ… А зачем fork 2 раза? Мне обычно одного хватало smile
Привычка :) 2 надо если демонизируешь процесс(http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012), а так действительно одного хватит.
Cyxapeff
Хм. Работает, но не совсем так как надо…

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 первый скрипт) вообще падает после этого. :(
slivlen
Cyxapeff
Пробовал добавить к аргументам “>”, “/dev/null”. Не помогает.
'> /dev/null' - обрабатывает shell. os.execl - сразу загружает новую программу в текущий процесс и не вызывает командный интерпритатор.
Как перенаправить вывод описано в комментах к ‘рецепту’(см. ссылку в моем предыдущем посте)
Cyxapeff
Спасибо. Тестовый скрипт работает как надо, а вот django всё равно ждёт завершения процесса. :(
Но я думаю этот вопрос надо задавать не сюда.
Cyxapeff
если кому интересно, то всё отлично работает в связке apache2+django. А вот на встроенном сервачке не хочет. Ну и ладно. )
slivlen
Cyxapeff
если кому интересно, то всё отлично работает в связке apache2+django. А вот на встроенном сервачке не хочет. Ну и ладно. )
Сталкивался с похожей проблемой. Форкал cgi скрипт на питоне и дочерний процесс переводил в фоновый режим. При использовании стандартного mod_cgi сервер всегда ожидал завершения дочернего процесса или убивал его по таймауту. Проблема заключалась в самом mod_cgi и решилась путем перехода на mod_python.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB