Встроенный в 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