Процесс завершается при завершении родителя

D
На сайте с 05.06.2007
Offline
155
3314

Приветствую!

Помогите решить задачку.

Через php (mod_php) необходимо запустить процесс в фоне, и так чтобы он не умирал при завершении родителя(в данном случае апача). Апач работает от пользователей так как настроен с mod_itk. У меня получается так что процесс запускается отлично и работат до тех пор пока апач не перезагрузить командой restart.

Запуск скрипта осуществляется таким способом:
exec("./script > /dev/null 2>&1 &");
и так пробовал
exec("nohup ./script > /dev/null 2>&1 &");
у него есть опция запуска как демона, тоже не помогает
exec("./script daemon > /dev/null 2>&1 &");
(пробовал также всевозможные функции, типо proc_open)

В чём тут фишка, и как можно её обмануть. Или это абсолютно нормально что при завершении процесса родителя убиваются все дочерние процессы, и ничего сделать нельзя? :gm:

Поидее при завершении родителя у дочернего процесса родителем становитсья init(1).

Написал не мало шедевров ;)
zexis
На сайте с 09.08.2005
Offline
388
#1

Для работы в фоне процесс должен быть оформлен в виде демона.

Его нужно отсоединить от родительского процесса, что бы он не уничтожался при завершении родителя.

В программе на С это делается так.


void daemon_init(){
int i;
pid_t pid;
if ( (pid = fork()) != 0)
exit(0); /* parent terminates */
/* 1st child continues */
setsid(); /* become session leader */

signal(SIGHUP, SIG_IGN);

if ( (pid = fork()) != 0)
exit(0); /* 1st child terminates */
/* 2nd child continues */

chdir("/"); /* change working directory */
//umask(0); /* clear our file mode creation mask */
for (i = 0; i < 64; i++)
close(i);

open("dev/null",O_RDONLY);
open("dev/null",O_RDWR);
}
Andreyka
На сайте с 19.02.2005
Offline
822
#2

ИШ ЧИВО ЗОДУМАЛ!

P.S. Используй для таких целей крон.

Не стоит плодить сущности без необходимости
N
На сайте с 06.05.2007
Offline
419
#3
zexis:
Его нужно отсоединить от родительского процесса, что бы он не уничтожался при завершении родителя.

Вообще-то nohup это все делает. Тут что-то сложнее. Либо недостаточно точно собраны исходные данные.

Dimanych, попробуйте с помощью ps выяснить кто там чей родитель, в какой группе и прочее.

Кнопка вызова админа ()
D
На сайте с 05.06.2007
Offline
155
#4
Andreyka:
ИШ ЧИВО ЗОДУМАЛ!

P.S. Используй для таких целей крон.

Запуск нужен мгновенный.

zexis, а этот механизм нельзя реализовать на шеле, например в init.sh ?

И получится ли это вообще если скрипт запускается не от суперюзера?

PS> сам скрипт уже скомпилирован и исходников у меня нет, так бы попробовал сделать эту вставку :)

N
На сайте с 06.05.2007
Offline
419
#5

Dimanych, ну попробуй selinux отключить

D
На сайте с 05.06.2007
Offline
155
#6

nohup только защищает от сигнала -HUP

Эти параметры PGID SID от скрипта принадлежат апачу, стоит процессу апача завершиться как скрипт отрубается,

щас копаю в сторону start-stop-daemon

Andreyka
На сайте с 19.02.2005
Offline
822
#7
Dimanych:

Запуск нужен мгновенный.

zexis, а этот механизм нельзя реализовать на шеле, например в init.sh ?
И получится ли это вообще если скрипт запускается не от суперюзера?

PS> сам скрипт уже скомпилирован и исходников у меня нет, так бы попробовал сделать эту вставку :)

Запускай через at, но если это шаред - хостер тебя пристрелит и правильно сделает

Бери для таких целей vps

D
На сайте с 05.06.2007
Offline
155
#8

да какой уж там, дедики, только дедики :)

Вообщем уже сам допёр до at, других вариантов больше нигде не описывают.

Была ещё надежда на start-stop-daemon, но увы, это видимо только от суперюзера.

echo "./script"|/usr/bin/at now

Результат именно тот что нужен был - скрипт живёт)

Всем спасибо за внимание ;)

Joker-jar
На сайте с 26.08.2010
Offline
171
#9

А если попробовать запустить в screen?

D
На сайте с 05.06.2007
Offline
155
#10

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий