Windows의 Perl CGI 스크립트에서 백그라운드 프로세스를 포크하려면 어떻게 해야 합니까?

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

문제

Windows에서 실행할 때 Perl CGI 스크립트에서 프로세스를 포크하는 데 문제가 있었습니다.주요 문제는 '포크'가 Windows에서 실행될 때 에뮬레이션되고 실제로 새 프로세스(현재 프로세스의 또 다른 스레드)를 생성하지 않는 것 같습니다.이는 프로세스가 완료되기를 기다리는 웹 서버(IIS 등)가 '백그라운드' 프로세스가 완료될 때까지 계속 대기한다는 의미입니다.

Windows의 CGI 스크립트에서 백그라운드 프로세스를 분기하는 방법이 있습니까?더 좋은 점은 크로스 플랫폼 방식으로 이 작업을 수행할 수 있는 단일 함수가 있습니까?

(그리고 삶을 더욱 어렵게 만들기 위해 포크된 프로세스 출력을 동시에 파일로 리디렉션하는 좋은 방법을 정말 원합니다.)

도움이 되었습니까?

해결책

플랫폼 독립적인 방식으로 이 작업을 수행하려면 프로세스::배경 아마도 가장 좋은 방법 일 것입니다.

다른 팁

사용 Win32::프로세스->만들기 DETACHED_PROCESS 매개변수 사용

펄포크:

Perl은 동일한 이름의 Unix 시스템 호출에 해당하는 Fork () 키워드를 제공합니다.Fork () 시스템 호출을 사용할 수있는 대부분의 Unix와 같은 플랫폼에서 Perl 's Fork ()는 간단히 호출합니다.

Fork () 시스템 호출을 사용할 수없는 Windows와 같은 일부 플랫폼에서는 Perl을 제작하여 통역 수준에서 Fork ()를 모방하도록 만들 수 있습니다.에뮬레이션은 Perl 프로그램의 레벨에서 실제 포크 ()와 가능한 한 호환되도록 설계되었지만 모든 의사 어린이``프로세스 '가이 방식으로 생성된다는 사실에서 비롯된 중요한 차이점이 있습니다. 운영 체제에 관한 한 동일한 실제 과정에서.

저는 특히 Perl에서 Win32 객체를 다룰 때 Windows에서 fork()에 대한 실제 문제를 발견했습니다.따라서 Windows에만 적용되는 경우 Perl 내의 Thread 라이브러리를 살펴보는 것이 좋습니다.

저는 IIS를 사용하는 웹사이트에서 한 번에 하나 이상의 연결을 허용하고 훨씬 더 많은 스레드를 사용하여 서로 다른 스크립트를 동시에 실행하는 데 이 방법을 사용합니다.

이 질문은 매우 오래되었으며 허용되는 답변은 정확합니다.그러나 나는 이것이 제대로 작동하도록 했고, 필요한 사람을 위해 그것을 달성하는 방법에 대해 좀 더 자세한 내용을 추가해야겠다고 생각했습니다.

다음 코드는 매우 큰 Perl CGI 스크립트에 존재합니다.이 특정 하위 루틴은 여러 티켓팅 시스템에서 티켓을 생성한 다음 반환된 티켓 번호를 사용하여 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