Встроенный в bash 'source' не распознается в среде cron
Пользовательская запись в crontab, которая гласит:
0 */4 * * * $HOME/postscript/fprogcache-sync
работает отлично. Желая добавить несколько переменных среды в контекст cron-job, я попытался
0 */4 * * * source $HOME/.profile; $HOME/postscript/fprogcache-sync
Это не сработало, пока я не изменился source за ., Сообщение об ошибке (отправлено почтой postfix в root) было /bin/sh: 1: source: not foundс последующим подтверждением, что сценарий продолжал выполняться счастливо.
Я помню, что где-то читал source определяется как псевдоним встроенного . в оболочке bash. Если это так, это объясняет, почему source не распознается в контексте cron.
Это так? Если да, то где общесистемный псевдоним для . определены?
2 ответа
Это так? Если да, то где общесистемный псевдоним для
.определены?
Это так, но не существует такой вещи, как общесистемный псевдоним.
. а также source являются такими же встроенными в Bash, но это определяется непосредственно на уровне исходного кода ( /questions/54617/v-chem-raznitsa-mezhdu-istochnikom-i/54631#54631).
Причина наличия двух имен для одной и той же встроенной системы, скорее всего, заключается в том, что Bash стремится в какой-то степени быть совместимым с POSIX; так source ради предоставления мнемонического имени и . ради соответствия стандартам POSIX.
Настоящая причина, почему source не работает в cron это по умолчанию cron рабочие места в crontab оправданы в sh, которая является символической ссылкой на /bin/dash (оболочка, которая также стремится быть POSIX-совместимой), которая просто не реализует source, Однако он реализует .,
От man dash:
. file
The commands in the specified file are read and executed by the
shell.
Я думаю, вам следует запустить свой скрипт на bash, попробуйте следующее:
0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync"
и если вы хотите добавить журнал в свою команду и сценарии отладки, добавьте журнал следующим образом:
0 */4 * * * /bin/bash -c "$HOME/postscript/fprogcache-sync" > /var/log/automatic_backup.log 2>&1