我有一个 zsh 脚本,我想每周通过 anacron 运行它。
它可以很好地从交互式 bash shell 运行,但是当通过 anacron 运行时,我收到未找到命令的错误,并且看起来它忽略了 shebang 行。
实际的 /etc/cron.weekly/ 脚本是:
#!/bin/sh
[ -x SCRIPT ] || exit 1
su NORMAL_USER SCRIPT
实际脚本的第一行是#!/bin/zsh
我怎样才能让 anacron 遵守 shebang 的规定?将 NORMAL_USER 的登录 shell 更改为 zsh 可以实现这一点吗?
答案1
为什么不起作用:
它不起作用的原因是 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
答案2
shebang 应该会处理好这个问题。当脚本在 下无法正确运行时,我首先要查看的cron
是环境变量,例如$PATH
。$PATH
forcron
比用户的简单得多。您可以$PATH
在脚本中设置cron
。
您还可以对脚本中所有可执行文件的完整路径进行硬编码。
如果zsh
没有,/bin/zsh
您应该会收到无效的解释器消息,但是您说它在 Bash 提示符下运行良好,所以我怀疑这是问题所在。
答案3
将用户的登录 shell 更改为 zsh 可实现此目的。无论如何,我一直想尝试将 zsh 作为我的登录 shell。没有什么比必要性更能推动你去做某事了。