Проблемы с 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 отправляет вам.

Другие вопросы по тегам