Исходный файл Crontab - PullRequest
       4

Исходный файл Crontab

4 голосов
/ 09 мая 2011

Недавно я создал bash-скрипт, который должен запускаться в cron.

После подготовки bash-скрипта и его нормальной работы я поместил его в Cron и обнаружил, что он не работает.В качестве второго шага я удалил все зависимости среды, т. Е. Вместо просто file.txt, я указал /home/blah-blah/file.txt

. Я все еще обнаружил, что скрипт не работает на одном шаге.Шаг был инструментом обработки данных.Команда, которую я выполнил, была /bin/blah-blah/processing_tool -parameter $INDEX, где $INDEX - это переменная, вычисленная в скрипте bash.

Третий шаг - добавить профиль bash в качестве источника в начале скрипта bash.Вуаля !!!!Сценарий начал отлично выполняться из cron.

Мой вопрос заключается в том, почему это происходит даже после того, как я удалил все зависимости среды из своего скрипта.Также я слышал, что поиск работы cron для профиля bash не рекомендуется.Если да, то есть ли другой способ, которым я могу избежать этого?

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

В основном: все, что начинается с cron, начинается с абсолютно чистого листа. Вы не можете делать никаких предположений относительно содержимого переменных среды или того, какая папка является текущей папкой в ​​начале любого скрипта, запускаемого из cron.

Самое простое решение: Перейдите в нужный каталог, чтобы убедиться, что ваш путь находится в нужном месте. Исходный файл / etc / profile должен убедиться, что вы настроили общесистемные переменные среды. source ~ myuserid / .profile для чтения настроек вашей личной среды. (~ / .profile не будет работать, так как это указывало бы на пользователя cron.) Затем начните выполнение фактического сценария. Конечно, описанный выше подход требует, чтобы процесс cron имел доступ для чтения к вашему домашнему каталогу, и он, вероятно, выполняет гораздо больше работы, чем на самом деле требуется.

Немного сложнее: выяснить, какие переменные среды требуются сценарию, и все, что вызывается сценарием. Явно экспортируйте их в начале скрипта cron.

(P.s. Замените / etc / profile и ~ myuserid / .profile любыми соответствующими файлами для выбранной вами оболочки.)

0 голосов
/ 09 мая 2011

A cron можно рассматривать как отдельного пользователя.Таким образом, этот «пользователь» не может «видеть» или «читать» те же файлы, что и вы.Таким образом, важно, чтобы все имена путей и т. Д. Были определены в абсолюте.

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

Существует два способа запуска задания cron:

  1. Как пользователь root,вы можете запустить su -user -c < job > в root crontab.
  2. Поиск вашего профиля явно, как вы сделали.
  3. Вы также можете установить переменные окружения в crontab.
  4. Как пользователь в пользовательском crontab, вы можете запустить его так: "/home/blah/.profile && myScript"

Тем не менееВ ваших переменных окружения ДОЛЖНО быть что-то (кроме расширений файлов), чего нет при запуске задания cron.Вам нужно будет выполнить этот скрипт с -x flag (in bash) и затем изучить выходной файл.Использование diff между переменными окружения и root/cron может быть указателем.Также проверьте, есть ли в ваших скриптах утилиты, чьи местоположения не являются частью переменной $PATH для cron / root.

...