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

Destroyer

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

Надо запустить процесс, например ping localhost в бэкграунде, через веб страницу. Делаю так:
PHP:
$Command = 'ping localhost';
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
В результате выдается PID процесса, но если посмотреть список процессов (ps ax), то этого процесса там нет, а последний PID ровно на 3 больше, чем тот, что выдало $PID. Т.е. процесс запустился и тутже закрылся. Перерыл кучу мануалов, но никак неудается запустить процесс через php, так, чтобы он продолжал работать пока его не убить вручную.
Права на запуск файла есть, если зайти из под юзера, от которого работает веб сервер, то все нормально вручную запускается.
Помогите, плз, правильно запустить процесс в фоновом режиме.
 

Alexandre

PHPПенсионер
запуская $PID = shell_exec() прежде свего запускаешь шелл, от имени процесса, под которым запущен php
в которой запускается уже указанный процесс : nohup.$Command
команда nohup - запускает еще одну оболочку
ну и наконец - запускается процесс $Command
по этому на три процесса и больше.

процесс будет жить, пока будет жить родительский процесс, т.е скрипт РНР.
нк и еще ошибочка может быть:
nohup ping localhost > /dev/null & echo $
посмотри сам:
[2] 13572
$
nmk@cmp1:/home/akalend$ nohup: ignoring input and redirecting stderr to stdout

что тебе мешало найти какая команда формируется и запустить в терминале?
 

Destroyer

Новичок
Т.е. запустить процесс как в windows:
PHP:
shell_exec($command);
неполучится?
Обязательно нужно чтобы скрипт работал? Может можно как-то через bash или еще как. Или неизбежно прийдется заниматься форкингом?

что тебе мешало найти какая команда формируется и запустить в терминале?
Непонял эту фразу. Мне надо запускать программу через веб страничку, программа работает долго, пока принудительно незавершишь ее.
Поясните плз.
 

Camillo

Новичок
Попробуй просто запускать команду со знаком амперсанда в конце, например ./script.sh &
 

Alexandre

PHPПенсионер
Попробуй просто запускать команду со знаком амперсанда в конце, например ./script.sh &
вот так не пойдет,потому что команда запустится бэкграундом в контексте окружения (bash ), которое вызовется командой system() и им аналогичным...
т.е. команда будет выполняться бэкграундом, но скрипт будет висеть, пока команда не закончится, после этого закончит работу оболочка окружения
и результат вернет управление рнр-скрипту.
что тебе мешало найти какая команда формируется и запустить в терминале?
Непонял эту фразу
подбери правильную команду, чтоб не было синтактических ошибок
PHP:
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
кажется здесь лишнее: echo $!...
могу ошибаться.

мне кажется без форканья не получится.
см nohup
nohup не переводит автоматически команду в фоновый режим; пользователь должен сделать это явным образом, завершив командную строку символом `&'.
вариант _RVK_ тоже как выход :)
я делал форканьем ...но у меня была сишная программа больших вычислений...
 

Destroyer

Новичок
Со значком $ Alexandre полностью прав, я что только неперепробовал.
echo $! здесь нужно, чтобы получить значение в $PID, без этого добавления в $PID пусто.
Screen, получается примерно тоже самое, что и форкинг - приходится помимо основной программы запускать дополнительный процесс, который висит в памяти, параллельно с основной программой.
Пока так и неудалось решить проблему.
Может есть что-то такое: php запускает это, оно запускает программу и завершается, давая работать запущенной программе и возвращая возможность php работать дальше?
 

crocodile2u

http://vbolshov.org.ru
Мобыть, не прям в этот момент запускать, а так: сформированную команду положить в файл и по крону этот файлик проверять и запускать, если он не пустой?
 

Destroyer

Новичок
На счет крона - это крайний случай.
Вот попробовал вариант whirlwind ( http://ru2.php.net/manual/ru/function.posix-setsid.php )
Обнаружил, что проблема с функцией
pcntl_fork();
похоже, нет нужного расширения, подскажите плз, как его включить. В файле php.ini нет никаких у поминаний про fork.
Вот нашел, http://ru2.php.net/manual/ru/pcntl.installation.php
как мне добавить это расширение в уже установленный php?
 

crocodile2u

http://vbolshov.org.ru
$ cd /php/sources/dir/ext/pcntl
$ phpize
$ ./configure
$ make
$ make install

Затем добавить собранный модуль (pcntl.so) в php.ini
 

Destroyer

Новичок
Сорри, за отклонение от темы, но всеже, немогу найти нужный исходник. У меня Ubuntu linux. В репозитарии через поиск искал pcntl и fork, ничего не нашло. Если несложно, выложите плз скомпилленную библиотеку.
 

StUV

Rotaredom
Destroyer
версия вашего дистриба пхп какая?

-~{}~ 02.07.08 20:20:

смотрите здесь: [m]pcntl[/m]
 

Destroyer

Новичок
boombick
Пакет php5-cli стоит.
Код:
root@server:/# apt-get install php5-cli
Чтение списков пакетов... Готово
Построение дерева зависимостей
Reading state information... Готово
Уже установлена самая новая версия php5-cli.
StUV
Я ставил php 5.2.4.
Код:
apt-get install libapache2-mod-php5 libapache2-mod-ruby php5 php5-common php5-curl ...
 

boombick

boombick.org
Хм.. Странно.
ЕМНИП, при запуске скрипта из командной строки ф-ции управления процессами должны работать..
 

Destroyer

Новичок
Когда запускаю php из коммандной строки и там пишу:
Код:
root@server:/# php -a
Interactive shell

php > $pid = pcntl_fork(); echo $pid;
0
php > 4390
получается, форк работает, а при использовании через php с апаче, почему-то, как-будто незнает этой функции. Что тут можно сделать?
 

boombick

boombick.org
Хых.. А как он будет знать эту функцию, если выполняется как апачевский модуль, т.е. в контексте веб-сервера?

-~{}~ 03.07.08 00:08:

Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
http://ru2.php.net/manual/ru/intro.pcntl.php
 

Destroyer

Новичок
Получается, разрешить форкинг веб серверу нельзя?? Тогда теряется, практически, смысл php. Всего-то надо запустить процесс через веб страничку...
 

boombick

boombick.org
Тогда теряется, практически, смысл php
Т.е. по вашему весь смысл языка, изначально заточенного под веб, это форкаться?
Опишите лучше реальную задачу.. Сдается мне, что есть более красивое решение.
 
Сверху