Problemas com o JDBC (MySQL) do Java para o linux - O trabalho do Crontab causa falha de conexão no programa java, mas quando executar manualmente é bom

1

Assim como o título diz, eu tenho um problema com o Crontab e meu programa Java conectando-se a um banco de dados MySQL remoto.

O programa em si é bastante simples: ele se conecta ao banco de dados, pega duas tabelas (usuários e senhas), atribui isso a uma variável temporária e envia a saída da variável a um shell script que cria um novo usuário com home diretório e uma senha.

O próprio programa funciona quando executado manualmente, no entanto, quando tento executar o programa através do Crontab, ele não consegue se conectar ao banco de dados. Agora, eu tentei uma variedade de coisas diferentes para fazer isso funcionar, como atribuir o crontab a diferentes momentos do dia (temos outros programas acessando o banco de dados também, então eu atribuí um tempo quando os outros não o fizeram.), mas isso não funcionou e só me deu o mesmo problema. Eu tentei executar o programa Java diretamente do crontab, através de um script atribuído ao crontab, e através de um script que ativa o script anterior ... e cada método falha. (Os scripts são executados, mas novamente - nenhuma conexão com o banco de dados é feita).

Eu estou puxando meu cabelo para fora neste momento tentando descobrir isso ... Ele funciona quando eu manualmente executá-lo, ainda falha quando crontab tenta executá-lo ... (WTF?)

Além disso, o Crontab parece rodar bem enquanto executa todos os itens da lista, mas quando chega ao meu programa Java, a conexão nunca é feita por algum motivo ...

Então, se alguém tem uma pista sobre o que pode estar acontecendo aqui, eu agradeceria muito a contribuição.

Além disso, se alguém puder me dizer como imprimir a saída de erro da conexão SQL através do Java, isso pode me ajudar a diagnosticar o problema ...

Obrigado novamente!

Informações adicionais:

Running Ubuntu 4.4.3
Latest version of linux JDK from apt-get
Latest version of linux Java MySQL integration from apt-get
I do *NOT* have MySQL installed locally! everything is remote.

Linha Crontab usada para executar o programa java:

  30 14 *  *  * java -cp $CLASSPATH:/home/user/java myprogram > /home/user/java/user_logfile.txt

Classpath:

/usr/share/java/mysql-connector-java-5.1.10.jar

Informação atualizada:

Usando o conselho de Jukka sobre o printStackTrace, eu procurei no google um método para enviar o stacktrace para a função System.out.println para que o crontab pudesse me dar um resumo do que estava acontecendo. Eu consegui encontrar:

catch(Exception e)
{
ByteArrayOutputStream file = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(file);
e.printStackTrace(stream);
System.out.println("The result is :"+file.toString().trim());
}

que me ajudou a encontrar isso:

Error:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at prog_users.main(prog_users.java:24)

Então o erro principal é que o classpath do crontab não pode encontrar o driver jdbc!

Agora ... como eu altero o CLASSPATH para um processo que não possui diretório home ou .rcbash ...?

    
por Jason 20.05.2011 / 23:08

2 respostas

0

Solução:

A dica de Jukka sobre o StackTrace me deu uma dica sobre a solução, então uma boa parte do crédito foi para ele por me ajudar a encontrar a solução.

Então, basicamente, eu estava trabalhando nesse problema com uma mentalidade de janelas. Eu percebi que desde que eu configurei o CLASSPATH em Root (do qual o crontab estava sendo executado), o CLASSPATH seria definido. No entanto, para Linux, este não é o caso - o crontab precisa ter o CLASSPATH set.

que me levou a:

No programa java, substituí o

}catch(Exception e){
    e.printStackTrace();
}

com

}catch(Exception e){
    ByteArrayOutputStream file = new ByteArrayOutputStream();
    PrintStream stream = new PrintStream(file);
    e.printStackTrace(stream);
    System.out.println("The result is :"+file.toString().trim());
}

para que meu arquivo de log realmente mostre a saída de erro no arquivo de log quando executado a partir do crontab.

Então, para a solução:

Crie um script em /home/user/java chamado script1

script1:

#!/bin/bash
export CLASSPATH=/usr/share/java/mysql-connector-java-5.1.10.jar
java -cp $CLASSPATH:/home/user/java myprogram > /home/user/java/user_logfile.txt

Em seguida, usei sudo chmod 0755 /home/user/java/script1 para torná-lo executável.

- - - - -

Em seguida, substitua a linha crontab:

  30 14 *  *  * java -cp $CLASSPATH:/home/user/java myprogram > /home/user/java/user_logfile.txt

com:

  30 14 *  *  * /home/user/java/script1
    
por Jason 23.05.2011 / 20:27
1

O Cron enviará para você a saída de todos os trabalhos que executar, portanto, certifique-se de que, na falha, o programa forneça informações suficientes para que você possa diagnosticar o problema.

Quando seu programa Java falhar, imprima pelo menos o rastreamento de pilha de exceção para o fluxo de erro padrão e saia com um código de saída diferente de zero:

try {
    // your code here
    // ...
} catch (Exception e) {
    e.printStackTrace();
    System.exit(1);
}

Além disso, verifique se a entrega de mensagens está configurada corretamente, para que você receba os e-mails que o cron envia para você.

    
por Jukka Matilainen 22.05.2011 / 09:50