(Я уже читал, как я могу протестировать новый скрипт cron? )
У меня есть конкретная проблема (кажется, что задание cron не запускается или не работает должным образом), но проблема общая: я хотел бы отладить скрипты cronned. Я знаю, что могу установить * * * * * строку crontab, но это не вполне удовлетворительное решение. Я хотел бы иметь возможность запускать задание cron из командной строки, как если бы оно выполнялось cron (тот же пользователь, те же переменные окружения и т. Д.). Есть ли способ сделать это? Подождать 60 секунд, чтобы проверить изменения скрипта, нецелесообразно.
Ответы:
Вот что я сделал, и, похоже, работает в этой ситуации. По крайней мере, это показывает мне ошибку, тогда как запуск из командной строки, поскольку пользователь не показывает ошибку.
Шаг 1 : Я временно поместил эту строку в crontab пользователя:
затем вынул его, как только файл был написан.
Шаг 2 : Сделал себе маленький bash-скрипт run-as-cron, содержащий:
Итак, как пользователь, я смог
Это решение, очевидно, может быть расширено, чтобы использовать sudo или другое для большей гибкости.
Надеюсь, что это помогает другим.
источник
/usr/bin
. 2)cat …/cron-env
Выводит несколько строк, что не работает. Просто попробуйте выполнить/usr/bin/env -i $(cat cron-env) echo $PATH
в терминале, он выводит окружение буквально, а не использует его. 3) Текущая среда просачивается в эмулируемую среду cron. Попробуйте:export foo=leaked; run-as-cron echo $foo
.cat
выводит несколько строк, которые работают, потому что подстановка оболочки сворачивает их в одну строку, которую вы можете проверитьecho $(cat cron-env ) | wc
; ваш пример команды,/usr/bin/env -i $(cat cron-env) echo $PATH
подставляет$PATH
из вызывающей оболочки; вместо этого он должен вызывать подоболочку для подстановки в окружении, например/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Вы сделали ту же ошибку, снова заменив ее в вызывающей оболочке, а не в подпространствеЯ представляю решение, основанное на ответе Pistos, но без недостатков.
Добавьте следующую строку в crontab, например, используя
crontab -e
Создайте сценарий оболочки, который выполняет команду в той же среде, в которой выполняются задания cron:
Использование:
например
Обратите внимание, что второй аргумент необходимо заключать в кавычки, если он требует аргумента. Первая строка скрипта загружает оболочку POSIX в качестве интерпретатора. Вторая строка содержит файл среды cron. Это необходимо для загрузки правильной оболочки, которая хранится в переменной окружения
SHELL
. Затем он загружает пустую среду (чтобы предотвратить утечку переменных среды в новую оболочку), запускает ту же оболочку, которая используется для cronjobs, и загружает переменные среды cron. Наконец команда выполнена.источник
Поскольку crontab не выполняет эту работу, вы будете манипулировать его содержимым:
Что оно делает :
источник
sudo -H -u otheruser bash -c 'crontab..."
запустить crontab другого пользователяПо умолчанию, с большинством демонов cron по умолчанию, которые я видел, просто нет способа заставить cron запускаться прямо здесь и сейчас. Если вы используете анакрон, я думаю, что возможно запустить отдельный экземпляр на переднем плане.
Если ваши скрипты не работают должным образом, то вы не принимаете во внимание, что
Из crontab (5):
В общем, PATH - самая большая проблема, поэтому вам необходимо:
Если вам нужно запустить скрипт от имени другого пользователя без оболочки (например, www-data), используйте sudo:
Конечно, прежде всего нужно проверить, что ваш скрипт действительно выполняет то, что должен делать из командной строки. Если вы не можете запустить его из командной строки, он, очевидно, не будет работать с cron.
источник
Сценарий Марко у меня почему-то не сработал. У меня не было времени на отладку, поэтому я написал скрипт на Python, который делает то же самое. Это дольше, но: во-первых, это работает для меня, а во-вторых, мне легче понять. Измените «/ tmp / cron-env» на то, где вы сохранили свою среду. Вот:
источник
Ну, пользователь такой же, как тот, которого вы вводите в запись crontab (или в чей crontab вы добавляете его, поочередно), так что это не составляет труда.
crontab
(5) должен дать вам список установленных переменных окружения, их всего несколько.источник
В большинстве crontabs, таких как, например, vixie-cron, вы можете поместить переменные в сам crontab следующим образом, а затем использовать / usr / bin / env, чтобы проверить, работает ли он. Таким образом, вы можете заставить ваш скрипт работать в crontab, как только вы узнаете, что не так с скриптом run-as-cron.
источник
Решение Марко не сработало для меня, но скрипт Python Ноама сработал. Вот небольшая модификация сценария Марко, которая заставила его работать на меня:
Добавленные
set -a
переменные экспорта определены в сценарии $ 1 и сделали его доступным для команды $ 2Питон ps Noam работал, потому что он «экспортировал» среду в дочерний процесс.
источник
Если это сценарий оболочки, он должен пройти большую часть пути:
Это определенно выделит некоторые проблемы, если не все.
источник
Я никогда не находил способ запускать задания cron вручную, но эта статья предлагает установить ту же среду, что и cronjob, и запустить скрипт вручную.
источник
Вы можете запрограммировать работу, чтобы начать в следующую минуту :)
источник
Я прижалась к ответу Марко. Код показан ниже, но я буду поддерживать этот скрипт здесь .
Учитывая этот crontab:
Пример сеанса использования:
Это то
cronTest2
, что нужно правильно вызывать для установки переменных окружения так же, как это делает cron:cronTest
работаетcronTest2
с соответствующими переменными среды:источник