Perl's system() lance un processus, mais interrompt la relation parent/enfant?Pourquoi le processus ne démarre-t-il pas avec le système de Perl()?
test.pl:
use POSIX;
system("./test.sh &");
my $pid = `ps -C test.sh -o pid=`;
print "pid: -$pid-\n";
waitpid($pid, 0);
test.sh:
while true
do
sleep 1
done
Quand je lance test.pl, il trouve et imprime une pid correcte de test.sh. Mais waitpid() renvoie -1 et test.pl se ferme. Après que test.pl existe, test.sh est toujours en cours d'exécution.
Il ressemble à test.sh est pas un enfant de test.pl, qui brise waitpid(). Pourquoi cela se produit-il et comment faire fonctionner system()? Est-ce parce que Perl efface automatiquement les enfants? Si oui, comment puis-je résoudre une tâche générale d'attente sur un enfant explicitement?
Mise à jour:
réponses ci-dessous suggèrent avec fork/exec. Le problème initial est le suivant:
À partir d'un script Perl, exécutez un utilitaire de ligne de commande qui démarre un service. L'utilitaire quitte mais le service reste.
après un certain temps, constater que pid de service et attendre là-dessus.
fork/exec ne résout pas cela, même si cela éclaircit la question.
Pourquoi fais-tu ça? – jrockway
@Liudvikas réponse est exactement exact. Si vous voulez waitpid, utilisez fork et exec, pas de système. –