Comment puis-je créer un processus en arrière-plan à partir d'un script Perl CGI sous Windows ?

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

Question

J'ai eu quelques difficultés à créer des processus à partir d'un script Perl CGI lors de l'exécution sous Windows.Le principal problème semble être que « fork » est émulé lors de l’exécution sous Windows et ne semble pas réellement créer un nouveau processus (juste un autre thread dans le processus actuel).Cela signifie que les serveurs Web (comme IIS) qui attendent la fin du processus continuent d'attendre la fin du processus « en arrière-plan ».

Existe-t-il un moyen de créer un processus en arrière-plan à partir d'un script CGI sous Windows ?Mieux encore, existe-t-il une seule fonction que je peux appeler et qui fera cela de manière multiplateforme ?

(Et juste pour rendre la vie encore plus difficile, j'aimerais vraiment un bon moyen de rediriger en même temps la sortie des processus forkés vers un fichier).

Était-ce utile?

La solution

Si vous souhaitez le faire de manière indépendante de la plateforme, Proc::Arrière-plan est probablement la meilleure façon.

Autres conseils

Utiliser Win32 :: Processus-> Créer avec le paramètre DETACHED_PROCESS

fourchette à perl:

Perl fournit un mot-clé Fork () qui correspond à l'appel système UNIX du même nom.Sur la plupart des plates-formes de type Unix où l'appel système Fork () est disponible, Perl's Fork () l'appelle simplement.

Sur certaines plates-formes telles que Windows où l'appel système Fork () n'est pas disponible, Perl peut être conçu pour imiter Fork () au niveau de l'interprète.Bien que l'émulation soit conçue pour être aussi compatible que possible avec la vraie fourche () au niveau du programme Perl, il existe certaines différences importantes qui découlent du fait que tous les `` processus '' de pseudo créés de cette façon en direct dans le même processus réel en ce qui concerne le système d'exploitation.

J'ai trouvé de vrais problèmes avec fork() sous Windows, en particulier lorsqu'il s'agit d'objets Win32 en Perl.Ainsi, si cela doit être spécifique à Windows, je vous recommande vraiment de consulter la bibliothèque Thread de Perl.

J'utilise cela à bon escient en acceptant plus d'une connexion à la fois sur des sites Web utilisant IIS, puis en utilisant encore plus de threads pour exécuter différents scripts en même temps.

Cette question est très ancienne et la réponse acceptée est correcte.Cependant, je viens de faire fonctionner cela et j'ai pensé ajouter quelques détails supplémentaires sur la façon de l'accomplir pour tous ceux qui en ont besoin.

Le code suivant existe dans un très gros script Perl CGI.Cette sous-routine particulière crée des tickets dans plusieurs systèmes de billetterie, puis utilise les numéros de ticket renvoyés pour effectuer un appel automatisé via les services Twilio.L'appel prend un certain temps et je ne voulais pas que les utilisateurs de CGI aient à attendre la fin de l'appel pour voir le résultat de leur demande.Pour cela, j'ai fait ce qui suit :

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

Je suis sûr que le nombre aléatoire généré et attaché au pid est excessif, mais je n'ai aucun intérêt à créer des problèmes extrêmement faciles à éviter.J'espère que cela aidera quelqu'un qui cherche à faire le même genre de chose.N'oubliez pas d'ajouter use Proc::Daemon en haut de votre script, mettez en miroir le code et modifiez les chemins et les noms de votre programme, et vous devriez être prêt à partir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top