Почему моя командная строка не запускается из cron? - PullRequest
5 голосов
/ 23 апреля 2009

У меня есть Perl-скрипт (входит в семейство XMLTV"grabbers", в частности tv_grab_oztivo).

Я могу успешно запустить его так:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml

Я использую полные пути ко всему, чтобы устранить проблемы с рабочим каталогом. Разрешения не должны быть проблемой.

Итак, если я запускаю его из терминала (Mac OSX), он работает просто отлично.

Но когда я запускаю его через задание cron, кажется, что ничего не происходит вообще. Выходные данные не создаются и т. Д.

Насколько я понимаю, в crontab нет ничего плохого, потому что, если я подставлю helloworld.pl для реального скрипта, он будет работать нормально в нужное время.

Итак, что я могу сделать для отладки? Посмотрев на %ENV в двух случаях, я вижу, что среда сильно отличается, но какие еще подходы я могу использовать для отладки? Как я могу увидеть вывод задания cron, который может быть каким-то perl-сообщением «die» или «not found» из оболочки или чем-то еще?

Или я должен пытаться каким-то образом дать версии cron команды ту же среду, в которой она запущена как я?

Ответы [ 5 ]

8 голосов
/ 23 апреля 2009

Это часто , потому что вы не получаете полную среду при работе под cron. Лучше всего захватить выход с помощью команды:

( /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1

, а затем взгляните на /tmp/qq.

Если это окажется отсутствующей средой, то вам может понадобиться ввести:

. ~/.profile

или что-то подобное, в цепочку выполнения вашего задания cron, например:

( . ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1
3 голосов
/ 23 апреля 2009

Если вы смотрите на% ENV в двух случаях, я бы предложил, чтобы в качестве первого шага в вашем Perl-скрипте задали для% ENV значение в задании cron, а затем пытались запустить его из командная строка. Возможно, вам придется выполнить себя один раз, чтобы получить полный контроль:

BEGIN {
  if (exists $ENV{something_in_your_env_not_in_cron}) {
     %ENV = (...);
     exec $^X, $0, @ARGV;
  }
}

Теперь попробуйте запустить его и посмотреть, есть ли что-нибудь, что вы можете сделать для его отладки (включая запуск под perl -d, если требуется). Скорее всего, вы обнаружите, что заканчиваете тем, что добавляете элементы обратно в% ENV по одному, пока он волшебным образом не начнет работать (LD_LIBRARY_PATH хорош для этого, но ORACLE_HOME или DB2HOME для Oracle или приложений DB2 также могут быть хорошим выбором ). Затем вы можете установить переменную в своем скрипте или в crontab.

0 голосов
/ 23 апреля 2009

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

Файл: /files/cron1.sh

#!/bin/sh
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml

А потом в хрон:

/files/cron1.sh

Это позволяет вам тестировать скрипт независимо от cron. Помните, что ваша оболочка входа в систему работает с переменными окружения, отличными от cron.

0 голосов
/ 23 апреля 2009

Я бы запустил простой скрипт оболочки по абсолютному пути из команды cron. Внутри этого скрипта я бы гарантировал, что я поместил stdout и stderr в известный (или узнаваемый) файл. Я также гарантирую, что достаточно вашей среды установлено. В Unix вы практически не устанавливаете среду, когда запускаете команду через cron - я не уверен насчет MacOS X. Стандартным виновником проблем является PATH. У меня есть отдельный .cronfile, который устанавливает мою рабочую среду достаточно, чтобы у меня обычно не возникало проблем - это аналог .profile.

0 голосов
/ 23 апреля 2009

cron обычно фиксирует выходные данные stdout и stderr и отправляет по электронной почте любые выходные данные владельцу crontab.

Вы дважды проверили запись crontab, чтобы убедиться, что она действительна и будет выполнена в нужное время?

Убедитесь, что сценарию не нужны никакие переменные среды. В противном случае оберните его в другой (bash) скрипт, где вы можете установить переменные окружения, которые ожидает другой скрипт.

...