Как я могу запустить и забыть процесс в Perl?

Кто-то может сказать мне как "выпустил-забыл" процесс в Perl? Я уже посмотрел на рубин: как запустить и забыть подпроцесс? для того, чтобы сделать то же в Ruby.

12
задан Community 23 May 2017 в 10:29
поделиться

4 ответа

из PERLFAQ8 Ответ на Как начать процесс на заднем плане?


Несколько модулей могут начать другие процессы, которые не Заблокируйте свой Perl программа. Вы можете использовать IPC :: Open3, Parallel :: Jobs, IPC :: Run, а некоторые модули POE. Смотрите CPAN для более подробной информации.

Вы также можете использовать

system("cmd &")

, или вы могли бы использовать вилку, как документировано в «Fork» в Perlfunc, с дальнейшим Примеры в Perlipc. Некоторые вещи, которые нужно знать, если вы на Unix- Как и система:

STDIN, STDOUT и STDERR совместно используются

как основной процесс, так и на фиксированном («ребенок» Процесс) Обносите один и тот же stdin, Stdout и STDERR Filehandles. Если Оба попытаются получить доступ к ним одновременно, могут произойти странные вещи. Ты Может захотеть закрыть или открыть их для ребенка. Ты можешь получить вокруг этого с «открытым» трубой (см. «Открыть» в Perlfunc), но на Некоторые системы это означает, что ребенок не может пережить родитель.

Сигналы

Вам придется поймать сигнал SIGCHLD и, возможно, тоже Sigpipe. Sigchld отправляется, когда фиксированная обработка процесса. Sigpipe есть Отправлено, когда вы пишете в Filehandle, чей дочерний процесс закрыл (Невернутая SIGPIPE может привести к умиранию вашей программы молча). Это не проблема с «системой (« CMD & »)».

Зомби

Вы должны быть готовы «пожинать» дочернего процесса, когда это заканчивается.

   $SIG{CHLD} = sub { wait };

   $SIG{CHLD} = 'IGNORE';

Вы также можете использовать двойную вилку. Вы немедленно ждете () для вашего Первый ребенок, а демон init ждет () для вашего внука Как только это выходит.

   unless ($pid = fork) {
       unless (fork) {
           exec "what you really wanna do";
           die "exec failed!";
       }
       exit 0;
   }
   waitpid($pid, 0);

См. «Сигналы» в Perlipc для других примеров кода, чтобы сделать это. Зомби не являются проблемой с «системой (« PROG & »)».

20
ответ дан 2 December 2019 в 07:21
поделиться

Если вы хотите, чтобы Watchdog «Child» процесс уйти, когда «родительский» выходит, вы не хотите, чтобы родительский процесс «огонь и забыл» ребенка процесс. Вам либо нужно вилить (как описано Brian d Foy), либо передавать PID родителя к ребенку (поэтому последнее может опросить таблицу процесса - не рекомендуется).

0
ответ дан 2 December 2019 в 07:21
поделиться

Если вы хотите демоминизовать ваш сценарий Perl, я бы посмотрел в ProC :: Daemon.

1
ответ дан 2 December 2019 в 07:21
поделиться

Ну не следует использовать систему () , так как я понимаю, этот вызов будет дождаться возврата функции перед продолжением выполнения. Я бы просто выловил в Linux и начну этот процесс, хотя имею в виду, что этот путь будет осматривать новую копию оболочки, и поэтому, если вы ищете производительность, я бы не сделал это в цикле, например:

Process_Name> / dev / null 2> & 1 & ;

, который начнет перенаправление процессов STDOUT и STDERR - / dev / null .

0
ответ дан 2 December 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: