Проблемы с JDBC Java (MySQL) для Linux - задание Crontab вызывает сбой соединения в программе Java, но, когда выполнено вручную прекрасен

Таким образом, как заголовок указывает, у меня есть проблема с Crontab и моей программой Java, соединяющейся с удаленной базой данных MySQL.

Сама программа довольно проста: это соединяется с базой данных, захватывает две таблицы (пользователи и пароли), затем присваивает это временной переменной и продвигает переменный вывод к сценарию оболочки, который создает нового пользователя w/корневой каталог и пароль.

Сама программа работает, когда выполнено вручную, однако когда я пытаюсь запустить программу через 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

Путь к классу:

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

Обновленная информация:

Используя совет Jukka о printStackTrace, я искал на Google для метода для отправки stacktrace в функцию 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 драйвер!

Теперь..., как я изменяю ПУТЬ К КЛАССУ для процесса, который не имеет никакого корневого каталога или .rcbash...?

1
задан 23 May 2011 в 21:53

2 ответа

Решение:

Подсказка Jukka о StackTrace информировала меня на решении, таким образом, хорошее большинство кредита переходит к нему для помощи мне найти решение.


Так в основном я работал над этой проблемой с настроением окон. Я полагал это, так как я установил CLASSPATH в Корне (какой 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
0
ответ дан 7 December 2019 в 17:53

Крон отправит Вам по почте вывод всех заданий, которые он выполняет, поэтому удостоверьтесь, что при отказе Ваши выводы программы достаточно информации так, чтобы можно было диагностировать проблему.

Когда Ваша Ваша программа Java перестанет работать, распечатайте, по крайней мере, отслеживание стека исключительной ситуации к потоку стандартной погрешности и выходу с ненулевым кодом выхода:

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

Кроме того, проверьте, что Ваша доставка почты настраивается правильно, так, чтобы Вы получили письма, которые крон отправляет Вам.

1
ответ дан 7 December 2019 в 17:53

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

Похожие вопросы: