Могу ли я запустить скрипт, чтобы он не зависел от родительского процесса в Linux? - PullRequest
4 голосов
/ 13 мая 2009

Есть ли способ запустить сценарий из другого процесса, чтобы, если процесс умирает / завершается, сценарий все еще продолжается?

Будет ли setuid делать это? Если бы мне нужно было установить владельца как root, а затем запустить скрипт?

Например, если у меня есть какой-то PHP-код, запускающий скрипт, но httpd умирает или погибает, я думаю, что он забирает мой скрипт. Есть ли способ обойти это?

В частности, я нахожусь на Fedora 10 с Apache 2 и PHP 5.

Ответы [ 5 ]

5 голосов
/ 13 мая 2009

С здесь :

function become_daemon() 
{
    $child = pcntl_fork();
    if($child) {
        exit; // kill parent
    }
    posix_setsid(); // become session leader
}

Кроме того, рекомендуется закрыть STDIN, STDOUT и STDERR, но я не уверен, как это сделать в PHP.

4 голосов
/ 13 мая 2009

Попробуйте "nohup yourscript.sh &"

0 голосов
/ 13 мая 2009

Вы должны использовать php's pcntl_fork () (как рекомендовано @bmdhacks).

Основными процессами являются: fork, setsid, fork снова, chdir в / и закройте все дескрипторы открытых файлов. Стандартная практика также требует, чтобы вы создали файл с именем /var/run/$NAME (где $ NAME - имя вашего демона) и записали PID в этот файл, чтобы впоследствии вы могли контролировать выполнение процесса.

Я не программист php, но это стандартный * nix материал. Лучший пример php, который я могу найти в Google, выглядит так: hello-world-daemon-with-fork Но он не меняет свой рабочий каталог на '/', и, похоже, он не закрывает дескрипторы открытых файлов (я не уверен, как это будет работать в php), поэтому он не подключен к stdin, stdout, и stderr оригинального процесса.

Я выкопал еще немного и нашел другую статью, которая может помочь с php pcntl_fork ()

И, похоже, есть грушевый модуль System_Daemon , который обрабатывает это для вас (я нашел это через здесь ).

0 голосов
/ 13 мая 2009

Вы можете использовать встроенную в bash команду «disown», чтобы отделить задание от оболочки, которая его породила. Смотри: http://www.faqs.org/docs/bashman/bashref_79.html

0 голосов
/ 13 мая 2009

В командной оболочке вы можете добавить амперсанд (&) в конце командной строки, чтобы запустить команду в фоновом режиме, которая отделяет ее от оболочки.

Хорошая информация здесь: http://www.linuxforums.org/forum/linux-programming-scripting/50096-moving-processes-background-foreground.html

...