Назад | Перейти на главную страницу

Измените оболочку для работы cron

У меня есть zsh-скрипт, который я хотел бы запускать через anacron каждую неделю.

Он отлично работает из интерактивной оболочки bash, но при запуске anacron я получаю ошибки command not found, и похоже, что он игнорирует строку shebang.

Фактический сценарий /etc/cron.weekly/:

#!/bin/sh

[ -x SCRIPT ] || exit 1

su NORMAL_USER SCRIPT

И верхняя строка фактического сценария: #!/bin/zsh

Как я могу получить анакрон в честь шебанга? Сможет ли изменить оболочку входа NORMAL_USER на zsh?

Почему не работает:
Причина, по которой это не работает, заключается в том, что su требует, чтобы вы запускали команду из терминала, а cron не предоставляет терминал.

Простой способ сделать это - использовать Vixie Cron:
Если вы не возражаете против использования Vixie Cron, я думаю, что проще всего было бы вставить сценарий для этого пользователя, запустив от имени этого пользователя следующее:

crontab -e 

Затем используйте 0 0 * * 0 как раз.

Если вы хотите использовать Anacron в качестве пользователя:
Anacron полезен, если вы хотите убедиться, что работа не будет пропущена, если машина выключена. Чтобы запустить от имени другого пользователя, укажите другой файл вкладок anacron и каталог спула, поместите следующее в системный cron для запуска от имени указанного пользователя, anacron -t /home/foo/etc/anacrontab -S /home/foo/var/spool/ а затем отредактируйте этот файл вкладки, чтобы запустить сценарий.

Также есть мини-хауто, но это выглядит более сложным.

Однако вам нужно будет протестировать их, чтобы убедиться. Наконец, запомните это для будущего тестирования run-parts --test /etc/cron.weekly

Изменение оболочки входа пользователя на zsh делает эту работу. Я все равно давно хотел попробовать zsh в качестве оболочки для входа. Ничего подобного необходимости подтолкнуть вас к чему-то.

Шебанг должен об этом позаботиться. Первое, на что я обращаю внимание, когда скрипты работают некорректно в cron это переменные среды, такие как $PATH. В $PATH для cron намного проще, чем у пользователя. Вы можете установить $PATH в cron сценарий.

Вы также можете жестко запрограммировать полный путь ко всем исполняемым файлам в вашем скрипте.

Если zsh не на /bin/zsh вы должны получить неверное сообщение интерпретатора, но вы сказали, что он работает нормально из командной строки Bash, поэтому я сомневаюсь, что проблема в этом.