2008-09-05 7 views
6

J'ai eu quelques problèmes pour forcer les processus d'un script CGI Perl sous Windows. Le problème principal semble être que "fork" est émulé lors de l'exécution sur Windows, et ne semble pas créer un nouveau processus (juste un autre thread dans le courant). Cela signifie que les serveurs Web (comme IIS) qui attendent que le processus se termine continuent d'attendre que le processus 'background' se termine.Comment puis-je utiliser un processus d'arrière-plan à partir d'un script CGI Perl sous Windows?

Existe-t-il un moyen de supprimer un processus d'arrière-plan d'un script CGI sous Windows? Encore mieux, y a-t-il une seule fonction que je peux appeler qui le fera de manière multi-plateforme?

(Et juste pour rendre la vie plus difficile, je voudrais vraiment un bon moyen de rediriger la sortie des processus fourchus vers un fichier en même temps).

Répondre

9

Si vous voulez faire dans une plate-forme de manière indépendante, Proc::Background est probablement la meilleure façon.

0

perlfork:

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

Sur certaines plateformes telles que Windows où l'appel système fork() n'est pas disponible, Perl peut être construit pour Emuler fork() au niveau de l'interpréteur . Alors que l'émulation est conçue être aussi compatible que possible avec la fourche réelle() au niveau de le programme Perl, il y a certaines différences importantes qui découlent de le fait que tous les pseudo enfants `` processus '' créé de cette façon vivre dans le même processus réel en ce qui concerne le système d'exploitation est concerné.

0

J'ai rencontré de vrais problèmes avec fork() sous Windows, en particulier avec des objets Win32 en Perl. Donc, si ça va être spécifique à Windows, je vous recommande vraiment de regarder la librairie Thread dans Perl. J'utilise cela pour bien accepter plus d'une connexion à la fois sur les sites Web utilisant IIS, puis en utilisant encore plus de threads pour exécuter des scripts différents en même temps.

0

Cette question est très ancienne et la réponse acceptée est correcte. Cependant, je l'ai juste fait fonctionner, et j'ai pensé que j'ajouterais plus de détails sur la façon de l'accomplir pour quiconque en a besoin.

Le code suivant existe dans un très grand script CGI Perl. Cette sous-routine particulière crée des tickets dans plusieurs systèmes de billetterie, puis utilise les numéros de tickets retourné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 attendent que l'appel se termine pour voir la sortie de leur requête.À cette fin, je l'ai fait les suivantes:

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

Je suis sûr que le nombre aléatoire généré et attaché au pid est surpuissant, mais je n'ai aucun intérêt à créer des problèmes qui sont très facilement évités. Espérons que cela aidera quelqu'un qui cherche à faire le même genre de chose. Rappelez-vous d'ajouter use Proc::Daemon en haut de votre script, miroir du code et modifier les chemins et les noms de votre programme, et vous devriez être bon à faire.

Questions connexes