2010-02-08 2 views
6

Я попытался экспортировать мои пути и переменные, а crontab все равно не будет запускать мой скрипт. Я уверен, что я делаю что-то неправильно.скрипт оболочки не работает через crontab, работает отлично вручную

У меня есть сценарий оболочки, который запускает файл jar. Это работает неправильно.

После прочтения я читал об этом, как правило, из-за неправильных путей из-за того, что cron работает через свой собственный экземпляр оболочки и поэтому не имеет тех же настроек, что и мой профиль.

Вот что мой сценарий выглядит сегодня после нескольких модификаций:

#!/bin/bash -- 

. /root/.bash_profile 

/usr/bin/java -jar Pharmagistics_auto.jar -o 

... 

те самые важные части сценария, остальные просто оболочка на основе.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

+3

Почему вы используете относительный путь к java-бинарнику вместо абсолютного пути? – jamessan

+0

, вероятно, более подходит для serverfault или суперпользователя –

+0

Извините, я нахожусь немного вне связи с моим использованием nix. Как я узнаю абсолютный путь к исполняемому файлу java? does 'whereis java' не в счет? Я думаю, вы можете ссылаться на мою опечатку usr/bin/java. С тех пор я исправил это. Если это не то, что вы имели в виду, сообщите мне, и я исправлю это. – astro

ответ

13

Попробуйте указать полный путь к файлу фляги:

/usr/bin/java -jar /path/to/Pharmagistics_auto.jar -o 
+1

Я только что ударил по лбу. Хороший улов, спасибо за помощь Деннис, который исправил проблему. Поистине ценим это! – astro

3

Я бы просто сказал вам, что вы уже исключили: проверьте свой путь и окружающую среду.

Поскольку у вас есть alredy, сделайте это, начните отладку. Как и запись контрольных точек в файл журнала, чтобы узнать, как далеко ваш скрипт получает (даже если он вообще запущен), проверьте файл журнала cronjob на наличие ошибок, проверьте почту (cron отправляет письма на ошибки) и т. Д.

Not очень специфический, извините.

+0

Я пробовал MAILTO = myemail , но по какой-то причине я не получал никаких писем. Я также проверил cron logs/var/log/cron и, похоже, выполняет скрипт, а не часть java. – astro

1

Несколько мыслей.

  1. Снимите -- после #!/bin/bash
  2. Убедитесь, что прямой выход сценария видно по хрон к электронной почте или где-нибудь еще, где вы можете увидеть его (например MAILTO = desiredUser)
  3. Убедитесь, что ваш скрипт работает и не заблокирован другой продолжительном сценарий (например, на второй линии, добавьте touch /tmp/MY_SCRIPT_RAN && exit)
  4. отлаживать скрипт, используя set -x и set -v, как только вы знаете, что это на самом деле работает
+0

1. Я удалил -, чтобы отметить, что я также попытался добавить -l безрезультатно. 2. MAILTO по какой-то причине не присылает мне никаких писем, я не уверен, почему это так.Я добавил [email protected] прямо перед моим фактическим текстом cronjob, и когда я crun crontab cron.txt, он переваривается просто отлично, но все равно никаких электронных писем. 3. мой сценарий запущен, и он выполняет команды оболочки просто отлично, это только часть java, которая не выполняется, но не бросает мне никаких ошибок. 4. Что вы имеете в виду здесь? установить что-то до и после частей кода, о которых я сомневаюсь? – astro

+0

@astro - RE # 2 - установите его в учетную запись пользователя на локальном компьютере, RE # 3 - Спасибо за разъяснение. RE # 4 - Добавив в скрипт команду 'set -x', bash покажет вам, что он выполняет. 'set -v' предоставляет дополнительную информацию об оценке и расширении команды. –

+0

2. Не уверен, что для этого окна были настроены электронные письма. 4. Я добавил набор -v к скрипту и до сих пор не повезло. Я ничего не получаю. Я сменил скрипт на следующий/usr/bin/java -jar Pharmigistics.jar -o> javalog.txt, и javalog всегда пуст. Я ничего не вижу в сообщениях об ошибках,/var/log/cron сообщает мне, что он выполняет мой скрипт еще, что одна часть моего скрипта просто ничего не делает. – astro

2

«Экспорт моих путей и переменных» не будет работать, поскольку crontab запускается в другой оболочке другим пользователем.

Кроме того, не уверен, если это опечатка в том, как вы ввели этот вопрос, но я вижу:

usr/bin/java

... и я не могу не заметить вас» не указывая полный путь. Он ищет каталог с именем «usr» в текущем рабочем каталоге. Часто для crontab, cwd не определено, поэтому ваша ссылка не идет нигде.

Попробуйте указать полный путь от корня, например:

/usr/bin/java

Или, если вы хотите увидеть пример относительного Pathing в действии, вы можете также попробовать:

cd /

usr/bin/java

+0

Это была типовая благодарность за то, что она указала это. – astro

0

Вы определяете необходимые пути и env vars в своем личном .profile (или другом скрипте)? Вы пытались найти этот файл (или это то, что вы делаете уже с /root/.bash_profile?)

Еще один способ расспросить об этом: уверены ли вы, что любые необходимые пути и env vars, которые вы ожидаете, на самом деле доступный?

Если вы ничего не предпринимали, попробовали эхо-отдельные значения или просто использовали команду «env» в своем скрипте, а затем просмотрели файл stdout?

+0

Я считаю, что я ищу файл с помощью '. /root/.bash_profile '. Я не уверен, но я запустил cronjob и выполнил файл env> conEnv.txt, а затем сравнил результаты с моими собственными результатами команды env. Результаты, очевидно, были очень разными путями экспорта и т. Д. Затем я попытался добавить вместо «. /root/.bash_profile ': PATH = ... [мои среды здесь скопированы/вставлены из результатов запуска env с моим профилем пользователя] ..; экспорт PATH; и это тоже не сработало. – astro

0

обеспечивают полные пути к файлу фляги, и что пользователь бежишь кронтаб в? Если вы настроили его для обычного пользователя, считаете ли вы, что у пользователя есть разрешение на отправку профиля root?

Смежные вопросы