Я хотел бы настроить использование задания крона crontab -e
. Это задание должно быть выполнено как корень, таким образом, я думал, что просто включают запись sudo crontab -e
был бы достаточно. К сожалению, это не.
Сценарий я должен выполнить работы хорошо, если я непосредственно ввожу:
sudo /home/user/./script.sh
Я зарегистрирован машина как пользователь user
, и моя crontab запись (sudo crontab -e
) похож на следующее:
*/1 * * * * /home/user/./script.sh
Так, что я пропускаю здесь? У меня есть чувство, что проблема связана направо от текущего пользователя или чего-то вроде этого.
Во-первых, я смог избавиться от потребности быть корнем для выполнения сценария. Мой crontab
запись (классик crontab -e
так как я не должен больше быть корнем), выполнения каждую минуту, и:
* * * * * /home/user/script.sh
Мой script.sh
:
#!/bin/bash
set -e
# Other stuff
Снова, это работает, когда вручную вводят ./script.sh
, но не от крона задание создается.
Я знаю, имеют доказательство, что сценарий выполняется заданием крона. Я перенаправил ошибку на файле, как рекомендуется в комментарии, и получите следующую ошибку в нем:
python: can't open file 'get-status.py': [Errno 2] No such file or directory
Объяснить это, однажды в моем script.sh
, Я использую докера для выполнения некоторого другого сценария:
docker run -v $PWD:/t -w /t [image] [command] get-status.py
который снова, работы вручную (./script.sh
) но не от задания крона.
Так, я нашел проблему: docker run -v $PWD:/t [...]
скопируйте содержание текущего каталога в контейнер докера. Так как это выполняется от задания крона, текущий каталог является, конечно, не хорошим, таким образом file not found
исключение.
Я нахожу это довольно ужасным, чтобы сделать что-то как docker run -v /home/user/:/t [...]
был бы какой-либо другой путь?
Хотя этот вопрос отмечен как дубликат, это не та же проблема. У меня есть a PATH
проблема в рамках моего сценария, и должна была изменить его, так как это инициировано заданием крона, которое взяло $PWD
путь сценария.
См. мой собственный ответ.
Основной проблемой с моим вопросом была на самом деле проблема с PATH
Я определил в своем задании крона.
Задание крона используется для инициирования задания, и это задание скопирует текущий каталог в контейнер докера через docker run -v $PWD:/t [...]
.
Так как задание крона не инициировано из правильного каталога, я должен был изменить путь в своем сценарии, чтобы сказать докеру не использовать текущий каталог, но каталог, на котором находится сценарий.
Как указано в этом ответе, я изменяю строки к:
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
docker run -v $SCRIPTPATH:/t [...]