簡體   English   中英

如何從Windows上的Perl CGI腳本分叉后台進程?

[英]How can I fork a background processes from a Perl CGI script on Windows?

在Windows上運行時,我在使用Perl CGI腳本分析進程時遇到了一些問題。 主要問題似乎是在Windows上運行時模擬“fork”,並且實際上似乎並沒有創建新進程(只是當前的另一個線程)。 這意味着等待進程完成的Web服務器(如IIS)將繼續等待“后台”進程完成。

有沒有辦法從Windows下的CGI腳本中分離后台進程? 更好的是,我可以調用一個以跨平台方式執行此操作的功能嗎?

(只是為了讓生活變得更加困難,我真的想要一個將分叉進程輸出重定向到文件的好方法)。

如果您想以獨立於平台的方式執行此操作, Proc :: Background可能是最好的方法。

使用Win32 :: Process-> Create with DETACHED_PROCESS參數

我在Windows上發現了fork()的真正問題,尤其是在Perl中處理Win32對象時。 因此,如果它將是Windows特定的,我真的建議你看看Perl中的Thread庫。

我使用這個很好,在使用IIS的網站上一次接受多個連接,然后使用更多線程一次執行不同的腳本。

perlfork

Perl提供了一個fork()關鍵字,它對應於同名的Unix系統調用。 在大多數類似於Unix的平台上,fork()系統調用可用,Perl的fork()只是調用它。

在某些平台(如Windows)上,fork()系統調用不可用,可以構建Perl以在解釋器級別模擬fork()。 雖然仿真被設計為與Perl程序級別的真實fork()盡可能兼容,但是存在一些重要的差異,這些差異源於所有偽子“進程”以這種方式創建的事實就操作系統而言,在相同的實際過程中。

這個問題非常陳舊,接受的答案是正確的。 然而,我只是讓這個工作,並認為我會添加一些關於如何為任何需要它的人完成它的更多細節。

以下代碼存在於一個非常大的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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM