Comment puis-je exécuter Perl système de commandes en arrière-plan?
#!/usr/bin/env perl
use warnings; use strict;
use 5.012;
use IPC::System::Simple qw(system);
system( 'xterm', '-geometry', '80x25-5-5', '-bg', 'green', '&' );
say "Hello";
say "World";
J'ai essayé d'exécuter le xterm-commande en arrière-plan, mais il ne fonctionne pas:
Pas de chemin d'accès absolu trouvé pour le shell: &
Quelle serait la bonne façon de le faire fonctionner?
testé ici semble sorta de travail pour moi. qu'essayez-vous de réaliser?
est-il censé ouvrir le terminal et ensuite imprimer bonjour tout le monde dans le terminal?
ou êtes-vous juste essayer de faire un appel asynchrone ouvrir le terminal?
Le "dit" ne le sont que pour vérifier si le xterm s'exécute en arrière-plan.
J'ai pensé à elle (à l'aide d'un seul argument) il y a quelques temps, mais en attendant, je l'ai oublié (entre-temps, la forme "moyenne" de temps?). J'espère que je ne l'oublie pas une seconde fois.
est-il censé ouvrir le terminal et ensuite imprimer bonjour tout le monde dans le terminal?
ou êtes-vous juste essayer de faire un appel asynchrone ouvrir le terminal?
Le "dit" ne le sont que pour vérifier si le xterm s'exécute en arrière-plan.
J'ai pensé à elle (à l'aide d'un seul argument) il y a quelques temps, mais en attendant, je l'ai oublié (entre-temps, la forme "moyenne" de temps?). J'espère que je ne l'oublie pas une seconde fois.
OriginalL'auteur sid_com | 2010-04-26
Vous devez vous connecter pour publier un commentaire.
Perl système fonction a deux modes:
Dans le premier formulaire, vous devez être prudent pour échapper les caractères qui pourraient avoir une signification particulière pour le shell. La deuxième forme est généralement plus sûr puisque les arguments sont transmis directement au programme exec avais sans la coquille.
Dans votre cas, vous semblez être un mélange des deux formes. Le
&
personnage a seulement le sens de "commencer ce programme dans le contexte" si elle est passée à la coque. Dans votre programme, l'esperluette est passé 5ème argument de la commande xterm.Comme Jakob Kruse a dit la réponse simple est d'utiliser le formulaire de chaîne de
system
. Si l'un des arguments est venu à partir d'une source non fiable, vous devez utiliser le citant ou de fuir pour assurer leur sécurité.Si vous préférez utiliser le multi-argument formulaire, puis vous aurez besoin d'appeler fork() et puis probablement utiliser exec() plutôt que
system()
.system("./script.sh $arg1 &");
au lieu desystem("./script.sh", "$arg1", "&");
OriginalL'auteur Grant McLean
Noter que le formulaire de liste de système est précisément là pour pas traiter des caractères tels que
&
comme shell méta-caractères.De perlfaq8's réponse à Comment puis-je commencer un processus en arrière-plan?
OriginalL'auteur brian d foy
Avez-vous essayé?
http://www.rocketaware.com/perl/perlfaq8/How_do_I_start_a_process_in_the_.htm
OriginalL'auteur Jakob Kruse
Ce n'est pas purement une explication pour Perl. Le même problème est en C et d'autres langues.
D'abord comprendre ce que le système commande n':
Il n'a pas d'importance si vous passer plusieurs arguments ou d'un argument. La différence est que, avec plusieurs arguments, la commande est exécutée directement. Avec un argument, la commande est passée par le shell, et finalement exécuté comme:
Lorsque vous passez une commande en tant que some_command par1 par2 &, puis entre l'interpréteur Perl et la commande est la sh ou bash processus utilisé comme une enveloppe, et il est en attente pour some_command de finition. Votre script est en attente pour le shell interprète, et aucune autre waitpid est nécessaire, parce que Perl fonction système le fait pour vous.
Lorsque vous voulez mettre en œuvre ce mécanisme directement dans votre script, vous devez:
if
), utilisez laexec
fonction. Votre utilisateur est similaire à système, voir le manuel. Avis,exec
causes de l'enfant de programme processus/contenu/données de couverture par la commande exécutée.C'est pourquoi vous pouvez exécuter le processus en arrière-plan. J'espère que c'est simple.
L'exemple le plus simple:
OriginalL'auteur Znik