Запуск и остановка процесса через exec()

darkthor

Новичок
Всем привет. Я не силен в линуксе. Помогите пожалуйста составить команды, которые нужно послать в exec(). Есть скрипт-демон написанный на питоне. Запускаю так:
PHP:
$command =  'script.py' . ' > /dev/null 2>&1 & echo $!; ';
$pid = exec($command, $output, $return);
Пишу pid в файл.
Потом когда надо вызываю:
PHP:
$command =  "kill $pid";
exec($command, $output, $return);
Но что-то идет не так. kill всегда завершается с кодом 1. Что это значит? Может быть процесс вообще не остается как демон работать? Может быть его надо подругому запускать, чтобы он параллельно начал работать?
И как проверить существование процесса после запуска? ps aux | grep "script.py" показывает разный pid при каждом выводе.
Помогите пожалуйста разобраться.
Спасибо.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ребят, exec() создает шелл на вызов, который освобождается после вызова, вместе с запущенными программами. Что бы демонизироваться там, нужно отцепится от шелла nohup -ом или любым другим способом (SIGHUP обработать, например).
 

Breeze

goshogun
Команда форума
Партнер клуба
Ребят, exec() создает шелл на вызов
Да это-то понятно, товарищ не смотрит вывод exec после kill, который показал бы что-то типа No such process, половину вопросов сняло бы.

ИМХО, в общем случае, по-хорошему, если юзать php для запуска чего-то долгоиграющего, то лучше через pcntl_fork + posix_setsid
В этом случае отвязываешься от шелла, имеешь контрольный pid и сохраняешь контроль над запускаемым через exec скриптом, если упадет раньше времени, можно рестарт сделать, в лог плюнуть или еще что.

А еще опыт показывает, что лучше из-под "апача" не запускать, делать таск куда-то и по какому-нибудь крону проверять и стартовать.
 

darkthor

Новичок
Вывод после kill почему то пустой.
Ну в общем я понял что с kill пока бороться бессмысленно потому что процесс не демонезирован. Товарищ посоветовал обернуть вызов так:
sh -c '/path/to/daemon >/dev/null 2>&1 & echo $!'
 

Breeze

goshogun
Команда форума
Партнер клуба
ты уверен, что этот самый скрипт -- демон? и при этом не падает по какой-то причине?
ps aux | grep "script.py" должен показывать этот скрипт, а не только сам себя.
 

darkthor

Новичок
Я же сказал уже что запускал его неправильно :) Его нужно демонизировать и он будет работать в фоне. Я написал как мне посоветовал товарищ. Остальные вопросы про килл и поиск скрипта отпадают сами собой, потому что мы выяснили что скрипт не был демонезирован при запуске.
 
Сверху