Как я могу создать фоновые процессы из сценария Perl CGI в Windows?

StackOverflow https://stackoverflow.com/questions/45792

Вопрос

У меня возникли проблемы с разветвлением процессов из сценария Perl CGI при работе в Windows.Основная проблема, по-видимому, заключается в том, что «вилка» эмулируется при работе в Windows и на самом деле не создает новый процесс (просто еще один поток в текущем).Это означает, что веб-серверы (например, IIS), ожидающие завершения процесса, продолжают ждать завершения «фонового» процесса.

Есть ли способ отделить фоновый процесс от сценария CGI под Windows?Еще лучше, есть ли одна функция, которую я могу вызвать, которая сделает это кросс-платформенным способом?

(И чтобы еще больше усложнить жизнь, мне бы очень хотелось найти хороший способ одновременно перенаправить выходные данные разветвленных процессов в файл).

Это было полезно?

Решение

Если вы хотите сделать это независимым от платформы способом, Процесс::Фон вероятно, это лучший способ.

Другие советы

Использовать Win32::Процесс->Создать с параметром DETACHED_PROCESS

перлфорк:

Perl предоставляет ключевое слово fork (), которое соответствует одноименному вызову Unix с таким же именем.На большинстве платформ, похожих на UNIX, где доступен системный вызов Fork (), Perl's Fork () просто называет его.

На некоторых платформах, таких как Windows, где системный вызов fork () недоступен, Perl может быть создан для эмуляции Fork () на уровне интерпретатора.Хотя эмуляция предназначена для того, чтобы быть максимально совместимым с реальным виком () на уровне программы Perl, существуют определенные важные различия, которые связаны с тем фактом, что все псевдо ребенка «процессы» создали этот путь в прямом эфире в том же реальном процессе, что касается операционной системы.

Я обнаружил реальные проблемы с fork() в Windows, особенно при работе с объектами Win32 в Perl.Таким образом, если это будет специфично для Windows, я бы действительно рекомендовал вам взглянуть на библиотеку Thread в Perl.

Я использую это с хорошим эффектом, принимая более одного соединения одновременно на веб-сайтах, использующих IIS, а затем использую еще больше потоков для одновременного выполнения разных сценариев.

Этот вопрос очень старый, и принятый ответ правильный.Однако я только что заставил это работать и решил добавить более подробную информацию о том, как это сделать, для всех, кому это нужно.

Следующий код существует в очень большом CGI-скрипте на Perl.Эта конкретная подпрограмма создает билеты в нескольких системах продажи билетов, а затем использует возвращенные номера билетов для автоматического вызова через службы Twilio.Вызов занимает некоторое время, и я не хотел, чтобы пользователям CGI приходилось ждать завершения вызова, чтобы увидеть результат своего запроса.С этой целью я сделал следующее:

  (All the CGI code that is standard stuff.  Calls the subroutine needed, and then)

  my $randnum = int(rand(100000));
  my $callcmd = $progdir_path . "/aoff-caller.pl --uniqueid $uuid --region $region --ticketid $ticketid";
  my $daemon = Proc::Daemon->new(
    work_dir     => $progdir_path,
    child_STDOUT => $tmpdir_path . '/stdout.txt',
    child_STDERR => $tmpdir_path . '/stderr.txt',
    pid_file     => $tmpdir_path . '/' . $randnum . '-pid.txt',
    exec_command => $callcmd,
  );
  my $pid = $daemon->Init();

  exit 0;

  (kill CGI at the appropriate place)

Я уверен, что случайное число, сгенерированное и прикрепленное к pid, является излишним, но я не заинтересован в создании проблем, которых очень легко избежать.Надеюсь, это поможет кому-то, кто хочет сделать то же самое.Не забудьте добавить use Proc::Daemon в верхней части вашего сценария отразите код и измените пути и имена вашей программы, и все будет в порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top