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 ...?