Temos um script em Perl que estamos usando (lançado do crontab) há vários anos para fazer upload de imagens usando o Net :: FTP. Recentemente, começamos a notar problemas em que as imagens não estavam sendo carregadas e os erros apareciam nos registros.
Na solução de problemas, descobri que atualmente o programa funciona bem quando iniciado a partir da linha cmd, mas quando iniciado a partir do crontab, ele apresenta erros consistentemente. No servidor remoto, posso ver no log de FTP que a conexão ainda está ativa, o cliente está mudando de diretórios, mas o comando STOR nunca aparece como ocorre em circunstâncias normais. No lado do cliente, quando o ftp- > put é emitido, a resposta parece ser '227 Inserindo o Modo Passivo'
Eu tentei tudo o que posso pensar para rastrear a causa (firewalls, portas efêmeras, vazamentos de memória), mas até agora minha única solução é executá-lo manualmente a partir da linha cmd.
Alguém tem alguma ideia de qual pode ser a causa deste problema?
Atualização: aqui estão alguns resultados de Debug = > 1:
Quando executado a partir do crontab e ele falha (a última linha 'ERROR' é do script perl e inclui a mensagem $ ftp- > que é "Entrando no Passive Mode"):
Net::FTP=GLOB(0xa004910)>>> CWD /images/shots
Net::FTP=GLOB(0xa004910)<<< 250 CWD command successful
Net::FTP=GLOB(0xa004910)>>> PASV
Net::FTP=GLOB(0xa004910)<<< 227 Entering Passive Mode (181,71,41,114,114,112).
ERROR: Couldn't put file /home/user/data/shot/212/212474.000078.jpg to f/4/f41891045708388275a0b1d1fe8a34fa.jpg on 127.0.0.1 because Entering Passive Mode (181,71,41,114,114,112).
Quando executado a partir da linha de comando e é bem-sucedido:
Net::FTP=GLOB(0x8619170)>>> CWD /images/shots
Net::FTP=GLOB(0x8619170)<<< 250 CWD command successful
Net::FTP=GLOB(0x8619170)>>> PASV
Net::FTP=GLOB(0x8619170)<<< 227 Entering Passive Mode (181,71,41,114,113,179).
Net::FTP=GLOB(0x8619170)>>> STOR 5/6/569e214479a6f99f5bdf920e75f8351e.jpg
Net::FTP=GLOB(0x8619170)<<< 150 Opening BINARY mode data connection for 5/6/569e214479a6f99f5bdf920e75f8351e.jpg
Net::FTP=GLOB(0x8619170)<<< 226 Transfer complete
E aqui está a parte do script que está fazendo isso:
if ( ! ( $ftp->put($src_file, $target_file) ) ) {
print STDERR "ERROR: Couldn't put file $src_file to $target_file on $ftp_host because " . $ftp->message . "\n";
} else {
$mv_result = 1;
}
O servidor executa stunnel para que a conexão FTP seja iniciada através de uma porta no host local (127.0.0.1)
Atualização: OK Eu descobri o que está acontecendo, há um argumento passado do crontab que informa qual rede usar. Acontece que o modem nessa rede está indo mal e eu estupidamente não estava passando esse argumento na linha cmd, nossa rede padrão funciona muito bem. só precisamos de um novo modem para nossa linha de upload dedicada. muito obrigado pela sua ajuda Steffen.