Запуск приложения в фоновом режиме (nix)

Alexandre

PHPПенсионер
http://ru2.php.net/manual/ru/function.posix-setsid.php
это нельзя использовать если скрипт запущен из под WEB сервера

-~{}~ 03.07.08 11:38:

получается, форк работает, а при использовании через php с апаче, почему-то, как-будто незнает этой функции. Что тут можно сделать?
см документацию, через апач работать не должно, тебя на неправильный путь натолкнули, где я был раньше???

-~{}~ 03.07.08 11:44:

Всего-то надо запустить процесс через веб страничку...
ну запустил, а что процесс делает??? что с результатами???
чем крон не устраивает??

у меня, например, разрабатывается визуальный графический редактор, который запускает сложные графические фильтры, они запускаются в фоне, отрабатываются и кладут результат в файл....
приложение аяксом тягает мониторинговый скрипт, который отслеживает процессинг работы граф фильтра, отображается в ввиде прогресс-бара,
по окончанию - переходим на страницу редактирования обработанного изображения ,
 

Destroyer

Новичок
Ну про смысл php, наверное, погорячился, но под windows запустить программу с сайта так, чтобы она потом работала самостоятельно с помощью php удается в одну строчку (exec()).
Задача: запускать, проверять запущена ли, останавливать программу на сервере. Программа может быть произвольной (конечно заранее известно какую программу надо запускать, проверять на запущенность и останавливать, это прописывается в конфиге скрипта).

Alexandre
Крон не устраивает тем, что запуск, проверка и остановка могут быть в произвольный момент, по запросу пользователя.
Результат работы - обработка информации, файлы, ...
запускает сложные графические фильтры, они запускаются в фоне
Вот мне тоже надо запустить процесс в фоне, результат я заберу потом (темже аяксом). Проблема в том как запустить процесс, чтобы он не закрылся (как в случае с запуском через .sh фаил) и не ожидался php, как в случае прямого запуска через shell_exec.
Подскажите,плз.
 

Destroyer

Новичок
Screen не пробовал пока. Что скрин, что форкинг - всеравно помимо запускаемого процесса в памяти будет висеть сторонний процесс, который не выполняет никакой функции кроме как быть родителем запускаемого процесса. Может можно как-то сделать запускаемый процесс самостоятельным?
Alexandre, как реализован запуск в фоне фильтров?
 

Alexandre

PHPПенсионер
я уже рассказывал,
что фильтры запускаэтся неким самописным монитором (реализован на си), который форкает дочерний процесс , а он уже вызывает соответствующий фильтр, а родительский процесс заканчивается, возвращает имя временного файла для мониторинга (хотя имя временного файла можно передавать параметром).

чуть позже выложу код, там всего несколько строк.
 

Destroyer

Новичок
Очень буду признателен, если можно еще команду как его скомпилировать.
 

Alexandre

PHPПенсионер
код здесь
теги рнр естественно не нужны ;)

запускается так
PHP:
 $fd = popen( './forking','r' );
 $str=fread($fd,1024 );
 fclose($fd);
 echo $str;
данный код запускает прогармму ./forking, выводит Ok и завершается,
а программа ./forking входит в фоновый режим и засыпает на 10 сек
проветить можно
Код:
 ps -ax| grep fork
  462 ??         0:00.00 ./forking
  464 ttys000    0:00.00 grep fork
через 10 сек завершается...
вместо строки 079 sleep(10); - вставляешь свои команды, если нужно использовать внешнюю программу, то используется exec или system в зависимости от обстоятельств
читаем man exec & man system
компиляция: gcc -o forking forking.c
вопросы - задавай, на то он и Форум %)
 

whirlwind

TDD infected, paranoid
Во, блин развели. Компилировать, момпилировать :) use perl не проще было?
 

Alexandre

PHPПенсионер
use perl не проще было?
для кого-то может и проще... а мне проще было скомпилировать, притом большая часть функционала у меня на си написана.
выложи свою версию на перле :)
можно реализовать такойже код (демона) и на пхп, используя pcntl
и зарускать через popen: " php forking.php ..."
это уже ни раз обсуждалось.
 

whirlwind

TDD infected, paranoid
Код:
#!/usr/bin/perl -w
# daemon.pl
use strict;
use POSIX qw/setsid/;

$SIG{CHLD} = 'IGNORE';
exit(1) unless defined(my $pid = fork());
exit(0) if $pid;
setsid();
system(join(" ",@ARGV));
 

Alexandre

PHPПенсионер
whirlwind вечером проверю, на сколько это работает

есть подозрение, что пхп-скрипт будет висеть пока процесс не закончится.отпишусь ...
 
Сверху