У меня есть 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, поэтому я сомневаюсь, что проблема в этом.