LINUX.ORG.RU

процессы умирают


1

1

запускаю php скрипт 1, который запускает php скрипт 2 через exec() в котором идет конвертация ffmpeg. Скрипт 1 контролирует число процессов, и смотрит чтобы их было не более заданного числа. Получается после того как скрипт 1 вызвал скрипт 2, то скрипт 2 самостоятельный скрипт не зависящий от первого. Скрипт 2 выполняет конвертацию и говорит о том что он завершил её успешно. НО если я посылаю скрипту 1 TERM (ctrl^C), то все запущенные скрипы 2 вместе с конвертирующимся ffmpeg умирают.

Вопрос - почему это происходит и как это предотвратить?

★★

я пых не знаю, но после короткого чтения доков нашлось вот такое:

If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.

оно, не?

ymn ★★★★★
()

лучше сразу поставь это в очередь на демоне

trashymichael ★★★
()

«Если процессы умирают, значит это кому нибудь нужно!»

Почитайте че нить про процессы. Я не спец, но ЕМНИП при прибитии предка должны дохнуть все потомки, кроме тех которые зомбированы.

Т.е. надо либо зомбировать потомков, либо предка отвязывать от терминала если ctrl-C связан именно с желанием освободить терминал.

AIv ★★★★★
()

почему это происходит

Процессы убиваются по сигналу HUP

как это предотвратить

posix_setsid() в php скрипте 2

Sorcerer ★★★★★
()
Ответ на: комментарий от AIv

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

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от AIv

Я не спец, но ЕМНИП при прибитии предка должны дохнуть все потомки, кроме тех которые зомбированы.

нет

Reset ★★★★★
()

почему это происходит и как это предотвратить?

я всех деталей уже не помню, но моё ламерское объяснение такое: в этом сценарии создаётся группа процессов и когда ты посылаешь сигнал он посылается всем. Подробности тут: http://en.wikipedia.org/wiki/Process_group

Это тема старая и избитая, в гугле найдёшь классические методы борьбы с этой фичей типа double fork итп.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Насколько я помню чтобы послать сигнал группе процессов надо полать сигнал с отрицательным номером.

Тут скорее всего либо процессам отправился SIGHUP, либо возможны варианты.

OxiD ★★★★
()
Ответ на: комментарий от DELIRIUM

тьфу, да. Ну я ж говорю, не спец.

По сабжу, вообще то я не знаю как там работает exec в пхп, но есть шанс что Ctrl-C прилетает не предку а потомку. Если тупо (без всякий многопоточных шняжек и освобождения терминала) запустить дочерний процесс, то ему достанутся потоки ввода-вывода родителя, и Ctrl-C тоже.

AIv ★★★★★
()
Ответ на: комментарий от OxiD

у меня уже голова не работает, но аналогичные проблемы я дебажил со strace (и systemtap в особо запущенных случаях) наблюдая откуда куда сигналы приходят. ТС рекомендую сделать то же самое.

true_admin ★★★★★
()

exec() в php и exec() как системный вызов мягко говоря разные вещи. php - интерпретатор, он перехватывает вывод из порождённого потомка и примерная цепочка C-шных вызовов - dup2(),fork(),exec(). То есть ещё имеются и общие дескрипторы.

зы man 7 signal - php всеми силами эмулирует _правильное_ поведение. Скрипты №2 должны завершаться.

зы Не пишите демонов на php :)

MKuznetsov ★★★★★
()

ctrl^C — это сигнал не процессу. Это комбинация клавиш, обрабатываемая терминалом и отправлющая сигнал SIGINT группе процессов, связанных с данным терминалом.

Для интереса попробуйте посмотреть, что у вас с процессами и их группами:

ps -eo pid,sid,pgid,tpgid,user,args --forest

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.