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

Другие вопросы по тегам