Comment puis-je réinitialiser STDIN / STDOUT / STDERR de Perl?
J'ai un script Perl qui fourches et daemonizes lui-même. Il est exécuté par cron, donc, afin de ne pas laisser un zombie autour, j'ai arrêté de STDIN,STDOUT, et STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
La question que je me pose est la suivante: je voudrais restaurer au moins STDOUT après ce point (il serait bon de rétablir les 2 autres). Mais ce que la magie des symboles dois-je utiliser pour re-ouvrir STDOUT comme ce STDOUT l'habitude d'être?
Je sais que je pourrais utiliser "/dev/tty" si j'ai été l'exécution d'un ats (mais je suis en cours d'exécution de cron et selon stdout ailleurs). J'ai aussi lu des trucs où vous pouvez mettre STDOUT de côté avec open SAVEOUT,">&STDOUT"
mais juste le fait de rendre cette copie ne résout pas le problème initial de laisser un zombie autour de.
Je suis à la recherche pour voir si il y a un peu de magie comme open STDOUT,"|-"
(qui je le sais n'est-ce pas) pour ouvrir la sortie standard de la façon dont il est censé être ouvert.
source d'informationauteur Josh
Vous devez vous connecter pour publier un commentaire.
Si c'est encore utile, deux choses me viennent à l'esprit:
Vous pouvez fermer STDOUT/STDERR/STDIN dans tout le processus enfant (c'est à dire si (!fork()). Cela permettra à la mère de continuer à les utiliser, parce qu'ils sont encore ouverts.
Je pense que vous pouvez utiliser la plus simple de fermer(STDOUT) au lieu de l'ouvrir vers /dev/null.
Par exemple:
# copie des descripteurs de fichier
# rediriger stderr dans d'avertissement fichier
# fermer l'redirigé descripteurs
# restaurer stdout et stderr
#J'espère que cela fonctionne pour vous.
#-Hariprasad AJ
Une fois fermé, il n'y a aucun moyen de la récupérer.
Pourquoi avez-vous besoin STDOUT de nouveau? Pour écrire des messages à la console? L'utilisation de /dev/console pour qu', ou écrire à syslog avec Sys::Syslog.
Honnêtement si, l'autre réponse est correcte. Vous devez enregistrer le vieux stdout (cloné à un nouveau fd) si vous souhaitez rouvrir plus tard. Il n'résoudre le "zombie" de problème, puisque vous pouvez rediriger les fd 0 (1 & 2) à /dev/null.