[Cascavel-pm] Duvida com exec
Luis Motta Campos
luismottacampos em yahoo.co.uk
Terça Agosto 12 22:25:18 PDT 2008
Agustinho Coelho wrote:
>
>> RTFM:
>>
>> exec LIST
>> exec PROGRAM LIST
>> The "exec" function executes a system command and never
>> returns-- use "system" instead of "exec" if you
>> want it to return. It fails and returns false only if
>> the command does not exist and it is executed
>> directly instead of via your system's command shell
>> (see below).
>>
>> []s,
>> Russo
>
> Russo,
>
> Eu li o manual e já tinha tentado antes do exec() usar o system() de
> diversas maneiras mas sem conseguir o efeito desejado. Achava que
> justamente por não retornar uma saída ele fosse mais simples. Segue o
> código como estava com o system() (seguindo exemplo do próprio perldoc):
>
> #/usr/bin/perl -w
>
> use strict;
> use warnings;
>
> my @ping = ("ping" , "-c4" , "192.168.0.222" , " " , "\>" , " " ,
> "/dev/null\>2\&1");
> my @mailup = ("sendmail" , "-f" , "user\@host.com.br" , "-t" ,
> "user\@host.com.br" , " " , "\<" , " " , "/home/bkpuser/netmailup.txt");
> my @maildown = ("sendmail" , "-f" , "user\@host.com.br" , "-t" ,
> "user\@host.com.br" , " " , "\<" , " " , "/home/bkpuser/netmaildown.txt");
>
> system (@ping);
>
> if ( $? == 0 ) {
> system (@mailup);
> } else {
> system (@maildown);
> }
>
> Eu tentei escapar todos os caracteres duvidosos, tentei interpolar de
> várias maneiras, mas sem sucesso algum. Ele sempre apresenta os
> seguintes erros:
> *sh: 1: command not found* ou *ping: unknown host >
> *
Mamma mia, nem posso acreditar. Alguém que tentou tratar erros do system().
Parabéns, Daniel. A única coisa que você não fez certo é esperar que o
system() incorpore a tua variável de ambiente PATH. Não tem PATH setado
quando você executa system, esta é a regra (sim, pode haver path, mas
isso é excessão).
Assim, você precisa passar caminho completo para todos os comandos que
executar:
__PERL__
my @ping = ("ping" , "-c4" , "192.168.0.222" );
if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
Repare em como eu trato erros de ping.
Agora, sério: se você vai "pingar" uma máquina, use o Net::Ping. E,
se pretende mandar emails, use Mail::Send ou seu módulo de SMTP
favorito... tenho certeza de que bastante gente aqui pode te dar boas
indicações.
Putamplexos.
--
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.
Mais detalhes sobre a lista de discussão Cascavel-pm