我有一个zsh脚本,我想每周通过anacron运行。
它从一个交互式的bash shell运行良好,但是当由anacron运行时,我得到的命令没有find错误,它看起来像是忽略了shebang线。
实际的/etc/cron.weekly/脚本是:
#!/bin/sh [ -x SCRIPT ] || exit 1 su NORMAL_USER SCRIPT
而实际脚本的第一行是#!/bin/zsh
我怎样才能得到ant来尊重she?? 将NORMAL_USER的loginshell更改为zsh是否可以实现这一目标?
为什么它不工作:
不起作用的原因是su要求你从terminal运行命令,cron不提供terminal。
简单的方法是使用Vixie Cron:
如果你不介意使用Vixie Cron,我认为最简单的做法是通过以该用户的身份运行以下内容来为该用户添加脚本:
crontab -e
然后用0 0 * * 0作为时间。
如果你想使用Anacron作为用户:
如果您想确保在机器closures时不会错过任务,Anacron会很有帮助。 要以不同的用户身份运行,请指定不同的anacron选项卡文件和spool dir,将以下命令放入系统cron中,以指定的用户身份运行: anacron -t /home/foo/etc/anacrontab -S /home/foo/var/spool/然后编辑该标签文件来运行该脚本。
还有一个小小的howto ,但是这看起来更复杂。
你将不得不testing这些,但要validation。 最后,请记住这一点,以便将来testingrun-parts --test /etc/cron.weekly
这个shebang应该照顾它。 当脚本在cron下无法正确运行时,我首先要看的是环境variables,例如$PATH 。 cron的$PATH比用户简单得多。 你可以在cron脚本中设置一个$PATH 。
您还可以在脚本中硬编码所有可执行文件的完整path。
如果zsh不在/bin/zsh你应该得到一个无效的解释器消息,但是你说它在Bash提示符下运行正常,所以我怀疑是这个问题。
更改用户的loginshell到zsh使这个工作。 无论如何,我一直想试用zsh作为我的loginshell。 没有什么需要给你推动一些事情。