2008-09-05 9 views
6

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

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

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

ответ

9

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

0

perlfork:

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

На некоторых платформах, таких как Windows, , где вилка() системный вызов не доступны, Perl может быть построен эмулировать вилкой() на переводчика уровне. В то время как эмуляция предназначена быть совместимыми, как это возможно с реальная вилка() на уровне Программа Perl, есть определенные важные различия, которые вытекают из тот факт, что все псевдо ребенок `` процессы '' создал этот способ в тот же реальный процесс, что и операционная система .

3

Использование Win32::Process->Create с параметром DETACHED_PROCESS

+0

URL, указанный выше, больше не действителен. – Rahul 2015-12-15 17:48:00

0

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

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

0

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

Следующий код существует в очень большом скрипте 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 = STL_DIR . "/aoff-caller.pl --uniqueid $uuid --region $region --ticketid $ticketid"; 
    my $daemon = Proc::Daemon->new(
    work_dir  => STL_DIR, 
    child_STDOUT => TMP_DIR . '/stdout.txt', 
    child_STDERR => TMP_DIR . '/stderr.txt', 
    pid_file  => TMP_DIR . '/' . $randnum . '-pid.txt', 
    exec_command => $callcmd, 
); 
    my $pid = $daemon->Init(); 

    exit 0; 

    (kill CGI at the appropriate place) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^