Проблемы с JDBC Java (MySQL) для Linux - задание Crontab вызывает сбой соединения в Java-программе, но при ручном запуске это нормально
Итак, как говорится в заголовке, у меня возникла проблема с подключением Crontab и моей Java-программы к удаленной базе данных MySQL.
Сама программа довольно проста: она подключается к базе данных, захватывает две таблицы (пользователи и пароли), затем присваивает ее временной переменной и передает вывод переменной в сценарий оболочки, который создает нового пользователя с домашним каталогом и паролем.,
Сама программа работает при запуске вручную, однако, когда я пытаюсь запустить программу через Crontab, она не может подключиться к базе данных. Теперь я попробовал множество разных вещей, чтобы заставить это работать, например, присваивая crontab разное время дня (у нас есть и другие программы, которые обращаются к базе данных, поэтому я назначил время, когда другие этого не сделали). но это не сработало и просто дало мне ту же проблему. Я попытался запустить программу Java непосредственно из crontab, через скрипт, назначенный для crontab, и через скрипт, который активирует предыдущий скрипт..., и каждый метод завершился неудачей. (Сценарии запускаются, но опять же - соединение с БД не устанавливается).
В этот момент я выдергиваю волосы, пытаясь понять это... Это работает, когда я запускаю его вручную, но не удается, когда crontab пытается его запустить... (WTF?)
Кроме того, кажется, что Crontab работает нормально, так как выполняет все элементы списка, но когда он попадает в мою Java-программу, соединение по какой-то причине никогда не устанавливается...
Так что если у кого-то есть подсказка о том, что здесь может происходить, я был бы очень признателен за вклад.
Кроме того, если кто-нибудь может сказать мне, как распечатать вывод ошибок SQL-соединения через Java, это может помочь мне / нам диагностировать проблему...
Еще раз спасибо!
Дополнительная информация:
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.
Строка Crontab, используемая для выполнения 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
Обновленная информация:
Воспользовавшись советом Юкки по поводу printStackTrace, я нашел в google метод, позволяющий отправлять трассировку стека в функцию System.out.println, чтобы crontab мог более точно дать мне дайджест журнала о происходящем. Мне удалось найти:
catch(Exception e)
{
ByteArrayOutputStream file = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(file);
e.printStackTrace(stream);
System.out.println("The result is :"+file.toString().trim());
}
который помог мне найти это:
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)
Поэтому основная ошибка в том, что путь к классам для crontab не может найти драйвер jdbc!
Теперь... как мне изменить CLASSPATH для процесса, у которого нет домашнего каталога или.rcbash...?
2 ответа
Решение:
Намек Юкки на StackTrace подсказал мне решение, поэтому большая часть заслуг принадлежит ему за помощь в поиске решения.
В общем, я работал над этой проблемой с настроением окон. Я понял, что так как я установил CLASSPATH
в Root (из которого запускался crontab), что CLASSPATH
будет определен. Однако для Linux это не так - crontab должен иметь CLASSPATH
задавать.
что привело меня к:
В Java-программе я заменил
}catch(Exception e){
e.printStackTrace();
}
с
}catch(Exception e){
ByteArrayOutputStream file = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(file);
e.printStackTrace(stream);
System.out.println("The result is :"+file.toString().trim());
}
так что мой файл журнала на самом деле показал бы вывод ошибок в файле журнала при запуске из crontab.
Итак, к решению:
Создать скрипт в /home/user/java
называется 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
Потом использовал sudo chmod 0755 /home/user/java/script1
сделать его исполняемым.
- - - - -
Затем замените строку crontab:
30 14 * * * java -cp $CLASSPATH:/home/user/java myprogram > /home/user/java/user_logfile.txt
с:
30 14 * * * /home/user/java/script1
Cron отправит вам по почте результаты всех выполненных заданий, поэтому убедитесь, что при сбое ваша программа выводит достаточно информации, чтобы вы могли диагностировать проблему.
Когда ваша Java-программа дает сбой, выведите хотя бы трассировку стека исключений в стандартный поток ошибок и завершите работу с ненулевым кодом выхода:
try {
// your code here
// ...
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
Также проверьте, правильно ли настроена доставка почты, чтобы вы получали письма, которые cron отправляет вам.