2009-08-16 4 views
3

J'écrire un code de test avant d'utiliser Proc::Daemon, ce que mon code de test est comme:Pourquoi mon programme n'écrit-il pas dans le fichier lors de l'utilisation de Proc :: Daemon?

#! /usr/bin/perl 

use strict; 
use warnings; 
use Proc::Daemon; 

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; } 

while ($continue) { 
    sleep(5) ; 
    &greeting ; 
} 

sub greeting { 
    open (FH, ">>/home/daogu/foo") or die "can't open it" ; 
    print FH "hello word\n" ; 
    close FH ; 
} 

Après avoir commencé le démon de jouet, je trouve que rien n'a réellement été écrit « foo ». Quelqu'un pourrait-il expliquer pourquoi cela arrive-t-il? Merci.

+2

Apparemment $ continuer passe à 0 quelque temps avant de vous réveiller de « sommeil 5 ». Un certain débogage de base vous aiderait probablement à comprendre ce qui se passe et aurait probablement pris moins de temps que de copier-coller sur un site Web. – jrockway

+0

Je pense que vous voulez un point-virgule à la fin de la ligne 9: '$ SIG {TERM} = sub {$ continue = 0; }; 'C'est peut-être une faute de frappe ici, et je ne pense pas que ce soit le problème racine. – Telemachus

+0

utilise la forme à trois arguments de 'open()'. –

Répondre

7

Tout d'abord, vous avez besoin d'un point-virgule pour mettre fin à l'affectation en ligne 9:

$SIG{TERM} = sub { $continue = 0 ; }; 

Jusqu'à ce que j'ajouté que, votre programme ne fonctionnerait pas même, donc je devine que vous avez dans la script et l'a manqué ici. Au-delà de cela, je soupçonne que Guss a raison, et vous avez des problèmes de permission. Voici un moyen de vérifier. Ouvrez un terminal distinct et exécutez top. Démarrez le script du démon, et vous verrez un processus Perl apparaître. Si le problème est des autorisations, vous verrez rapidement le processus Perl disparaître. Le script meurt dans le sous-programme, mais votre tentative de message d'erreur utile ne s'affiche jamais car le démon n'a pas accès à votre terminal à ce stade.

Un moyen rapide de faire varier ce test est de changer die à warn dans le sous-programme. Si vous le faites, le démon continuera à fonctionner pour toujours (vérifiez le terminal qui exécute top pour le confirmer). Mais si le problème est des autorisations, vous toujours ne verront pas un fichier être créé ou écrit. Edit: Yup, problème de permissions + pas d'accès à STDERR = démon silencieux et silencieux. Essayez cette version, mais assurez-vous que vous pouvez écrire dans le journal que vous passez en pour STDERR:

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; }; 

while ($continue) { 
    sleep(5); 
    greeting(); 
} 

sub greeting { 
    open STDERR, '>>', '/Users/telemachus/log' 
     or die "Can't reopen STDERR to log: $!"; 
    open my $fh, '>>', '/usr/local/foo' 
     or warn "Can't open /usr/local/foo for writing: $!"; 
    print $fh "hello word\n"; 
    close $fh; 
} 

Vous êtes susceptible de voir beaucoup de cela dans votre journal:

Can « t ouvert foo pour l'écriture: Permission refusée à la ligne démon 21. impression() dESCRIPTEUR fermé fh $ à la ligne démon 22.

+0

Je trouve toujours strace (1) d'être d'une grande aide dans la recherche de ces situations sans modifier le code d'origine. –

+0

@Dominic: bien que "sans altérer le code original" me semble très tentant, je ne peux pas vous mentir. Je ne pouvais pas déchiffrer la sortie de 'strace' (ou' dtrace' et 'dtruss' pour quelqu'un d'autre qui va le chercher sur un Mac) pour me sauver la vie. Je devrais vraiment apprendre comment. – Telemachus

3

Votre script me va bien. Très probablement, le problème est juste des autorisations de fichiers - assurez-vous que vous avez un accès en écriture au répertoire où le fichier est censé être créé, ou si le fichier existe déjà que vous avez un accès en écriture au fichier lui-même. Je lance votre script sur ma machine et cela fonctionne très bien.

+1

Vraiment? Même avec le point-virgule manquant sur la ligne 9? Mon expérience a donné ceci: 'erreur de syntaxe à la ligne de démon 11, près de") {"' et ainsi de suite. – Telemachus

+0

Oui, évidemment, j'ai corrigé cela - je ne pensais pas qu'il était important de le noter car le compilateur vous avertit immédiatement du problème. – Guss

+1

Assez juste, et je ne vous ai pas downvote pour cela. Cependant, vous dites "Votre script me va bien" ce qui était étrange pour moi car son programme ne compile pas. Perl vous dit "je mouille le lit", mais il ne dit pas exactement où. (C'est facile à trouver, mais le compilateur ne dit pas littéralement, "Hey, vous avez besoin d'un point-virgule à la fin de ce sous-programme anonyme sur la ligne 9.") Pour moi le plus gros problème est de laisser un point-virgule Les sous-marins anonymes sont assez courants en Perl, donc je pense qu'il vaut la peine de le mentionner. Le problème que le compilateur fait allusion est seulement facile à trouver si vous * savez * besoin d'un point-virgule là-bas. – Telemachus

Questions connexes