Команда which не возвращает ничего через cron, но работает через консоль

1244
Juan Delgado

Я написал небольшую утилиту в haXe + Neko, которая должна выполнять некоторые команды GIT. Чтобы избежать жесткого кодирования пути к исполняемому файлу GIT, я хотел бы использовать команду which, чтобы выяснить, где он находится. Все работает, как и ожидалось, при запуске вручную из консоли, но не тогда, когда приложение запускается по заданию cron.

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

/usr/bin/which git >> /home/user/git.txt 

Текстовый файл создан, но содержимое пусто. Опять же, при запуске из консоли все работает как положено.

Есть идеи? Я использую OS X Leopard, если это поможет.

Спасибо : )

Juan

1

3 ответа на вопрос

3
Marnix A. van Ammers

Если «which» может найти исполняемый файл, то и интерпретатор оболочки, выполняющий вашу команду cron, также может это сделать. Так что я не понимаю, почему вы хотите использовать «что» для этой цели. Но, может быть, у вас есть причина, которая не очевидна.

Команда 'which' использует каталоги, перечисленные в $ PATH, для поиска 1-го вхождения команды. Очень вероятно, что PATH не соответствует тому, что вы думаете. Попробуйте добавить '/ usr / bin / env >> /home/user/you/env.txt' в ваш crontab для запуска сегодня, через минуту. Затем загляните в /home/user/you/env.txt, чтобы увидеть, на что был установлен PATH. Если этот PATH не подходит для ваших целей, вам, возможно, придется поместить все ваши команды в небольшой сценарий оболочки, где вы можете установить PATH самостоятельно. Вы также можете посмотреть в этом файле env.txt другие экспортированные переменные окружения, поскольку это может пригодиться в зависимости от того, что вы хотите сделать через crontab.

Doh! Спасибо за указание на глупую ошибку. Juan Delgado 14 лет назад 0
2
Gordon Davisson

Где на самом деле находится git (то есть, если вы запускаете /usr/bin/which gitс консоли, что он печатает)? Если он не находится в каталоге в $ PATH (это просто / usr / bin и / bin на моей машине со Snow Leopard), /usr/bin/whichон не будет найден, и вам нужно либо жестко его кодировать, либо добавить строку вроде

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin 

в файл crontab.

0
DarenW

Будет ли это сделать трюк?

/usr/bin/env git 

Команда env заботится о поиске команды и сама всегда находится в / usr / bin (так мне сказали ...) Это распространенный прием в скриптах Python, необходимый из-за того, что разные дистрибутивы помещают python в разные места, но никто не хочет бездельничать, пытаясь найти где.

Нет. Проблема в том, что cron переопределяет PATH пользователя. env помогает только если программа находится в PATH. Mikel 13 лет назад 0