Cron скрипт не выполняется на Mavericks

12

Я настроил пользовательский файл crontab следующим образом:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh

Но это не будет выполнено. Я ждал минут 10-15. Почему?

Команда auto-update.sh запускается легко, если выполняется вручную. Как я могу разорвать цепочку выполнения и запустить мой скрипт из cron?

RomaValcer
источник
1
Какую ОС вы используете? Cron устарел в OS X, поэтому вам может понадобиться запустить демон?
bmike
Последний, 10.9.2. Как это сделать? Я просто хочу, чтобы скрипт работал каждый час, например. В приведенном выше сценарии я был в отчаянии, потому что он не работал, и изменил его, чтобы работать каждые 2 минуты.
RomaValcer
1
Демон cron должен запускаться автоматически (путем его замены, launchd), если существует файл crontab. См /System/Library/LaunchDaemons/com.vix.cron.plist (особенно KeepAliveи QueueDirectoriesэлементы).
Гордон Дэвиссон
ОК, Keeplive есть, но указан только путь к файлу / etc / crontab, который не существует. В QueueDirectories есть существующий файл в ограниченной папке «/ usr / lib / cron / tabs». Когда я открываю его с помощью su и vim, это моя задача.
RomaValcer

Ответы:

17

Среда, в которой выполняется задание cron, несколько отличается от интерактивной оболочки; скорее всего, скрипт работает, но не успешно. Одно из самых больших отличий заключается в том, что для заданий cron значение PATH по умолчанию просто "/ usr / bin: / bin", поэтому, если вы используете какие-либо команды, которых нет в / usr / bin или / bin, они не будут найдено, если ваш сценарий не устанавливает собственный PATH или не предоставляет явные пути к командам. Другое большое отличие состоит в том, что он просто не подключен к интерактивному сеансу, поэтому, если он попытается сделать что-то интерактивное (чтение из терминала и т. Д.), Это приведет к сбою. Попробуйте изменить запись cron на:

*/2 * * * * /Users/[my user]/Dropbox/htdocs/auto-update.sh >>/tmp/auto-update.log 2>&1

... и посмотрим, появится ли в журнале что-нибудь информативное.

Гордон Дэвиссон
источник
Это лучше, чем мои усилия - не стесняйтесь включать мою идею регистратора, если она улучшит ваш ответ.
bmike
Журнал просто не появился.
RomaValcer
@RomaValcer: это странно - это означает, что запуск сценария даже не заходит так далеко. Я бы запустил ps -ax | grep [c]ronи посмотрел, есть ли в нем список запущенного демона cron (/ usr / sbin / cron). Если это так, попробуйте bmike's logger test. В любом случае, проверьте журналы (/var/log/system.log и пункт «Все сообщения» в утилите Console) и посмотрите, есть ли что-нибудь подходящее.
Гордон Дэвиссон
Да, это там. Но журналы не показывают ничего, что начинается в запланированное время.
RomaValcer
4

Трудно сказать, но что, если вы добавили вторую задачу cron для выполнения каждые 5 минут или около того, и она вызывала какой-то системный инструмент, который записывает сообщения в system.log?

0,5,10,15,20 * * * * /usr/bin/logger "cron is working"

Таким образом, вы будете знать, что cron работает для данного пользователя и может сосредоточиться либо на запуске cron, либо на исправлении вашего скрипта, чтобы он работал в ограниченной среде cron. (Вы можете посмотреть на настенные часы и выбрать несколько раз, которые появятся в ближайшее время или даже в следующие несколько минут - например, для редактирования в 12:34 введите 35,36,37,38 минут для запуска и сохранения файла cron .)

bmike
источник
4

Уже давно вы задавали этот вопрос, но, похоже, в этой теме не найдено никакого решения.

В зависимости от способа создания пользовательского crontab может потребоваться выполнить его после редактирования:

crontab ~/.yourcrontabfile

Чтобы узнать, активирован ли новый crontab (также после его изменения), проверьте с помощью:

crontab -l
Бен
источник
Это не работает Crontab -l показывает, что кроны настроены, но все равно не работает.
PKHunter
1

У меня такая же проблема. Вам необходимо добавить путь к вашему bash-скрипту:

#!/bin/sh
PATH=/usr/local/bin:/usr/local/sbin:~/bin:/usr/bin:/bin:/usr/sbin:/sbin
Иван Жирков
источник
0

У меня такая же проблема. Он исчез после того, как я добавил новую строку после моей работы в моем файле crontab (я всего лишь crontab n00b, поэтому я не знаю, широко ли это поведение известно или нет).

RMD
источник