Domanda

Ho avuto qualche problema nel creare processi da uno script Perl CGI durante l'esecuzione su Windows.Il problema principale sembra essere che il "fork" viene emulato durante l'esecuzione su Windows e in realtà non sembra creare un nuovo processo (solo un altro thread in quello corrente).Ciò significa che i server Web (come IIS) che attendono il completamento del processo continuano ad attendere fino al termine del processo "in background".

Esiste un modo per creare un processo in background da uno script CGI in Windows?Ancora meglio, esiste un'unica funzione che posso chiamare che lo farà in modo multipiattaforma?

(E solo per rendere la vita ancora più difficile, mi piacerebbe davvero un buon modo per reindirizzare contemporaneamente l'output dei processi biforcati su un file).

È stato utile?

Soluzione

Se vuoi farlo in modo indipendente dalla piattaforma, Proc::Sfondo è probabilmente il modo migliore.

Altri suggerimenti

Utilizzo Win32::Processo->Crea con il parametro DETACHED_PROCESS

perlfork:

Perl fornisce una parola chiave FORK () che corrisponde alla chiamata di sistema UNIX con lo stesso nome.Sulla maggior parte delle piattaforme simili a UNIX in cui è disponibile la chiamata di sistema fork (), Perl's Fork () lo chiama semplicemente.

Su alcune piattaforme come Windows in cui la chiamata di sistema fork () non è disponibile, perl può essere costruito per emulare la forcella () a livello di interprete.Mentre l'emulazione è progettata per essere il più compatibile possibile con il vero fork () a livello del programma Perl, ci sono alcune importanti differenze che derivano dal fatto che tutti i "processi" pseudo Child sono stati creati in questo modo Nello stesso vero processo per quanto riguarda il sistema operativo.

Ho riscontrato problemi reali con fork() su Windows, soprattutto quando si ha a che fare con oggetti Win32 in Perl.Pertanto, se sarà specifico per Windows, ti consiglio vivamente di dare un'occhiata alla libreria Thread all'interno di Perl.

Lo uso con buoni risultati accettando più di una connessione alla volta su siti Web che utilizzano IIS e quindi utilizzando ancora più thread per eseguire script diversi contemporaneamente.

Questa domanda è molto vecchia e la risposta accettata è corretta.Tuttavia, ho appena fatto in modo che funzionasse e ho pensato di aggiungere qualche dettaglio in più su come realizzarlo per chiunque ne avesse bisogno.

Il seguente codice esiste in uno script CGI Perl molto grande.Questa particolare routine secondaria crea ticket in più sistemi di ticketing, quindi utilizza i numeri dei ticket restituiti per effettuare una chiamata automatizzata tramite i servizi Twilio.La chiamata dura un po' e non volevo che gli utenti CGI dovessero aspettare fino al termine della chiamata per vedere l'output della loro richiesta.A tal fine, ho fatto quanto segue:

  (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)

Sono sicuro che il numero casuale generato e collegato al pid sia eccessivo, ma non ho alcun interesse a creare problemi che possano essere evitati estremamente facilmente.Spero che questo aiuti qualcuno che cerca di fare lo stesso genere di cose.Ricordati di aggiungere use Proc::Daemon nella parte superiore del tuo script, rispecchia il codice e modifica i percorsi e i nomi del tuo programma, e dovresti essere a posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top