我在 OS X 中有一个脚本,它在给定目录中查找具有最近 mtime 的文件,查看它是否(过去)某个大小,如果是,则创建一个 AppleScript 对话框 + 重复调用say
命令,直到对话框关闭。我已经验证该脚本适用于任何给定目录,包括我感兴趣的目录。但是,只有当我从交互式 shell 运行它时(即通过 Terminal.app、xterm、等或 Emacs 中的 Eshell)。看,当我将脚本作为 cronjob 运行时,它所做的只是运行say
脚本中的调用一次;没有对话框,也没有重复,say
直到框关闭,这正是我期望它所做的。但是,我在我的 中没有收到任何错误消息mail
,因此似乎cron
认为一切正常。
我设置 cronjob 的方式如下:
SHELL=/bin/zsh
*/1 * * * * . $HOME/.zshrc && ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
翻译:它每分钟运行一次,首先进行采购~/.zshrc
(设置环境变量,如$PATH
等)。然后它运行ps caux
,grepping 我的脚本的进程名称,如果找到匹配则不执行任何操作。否则,运行我的脚本,目标为/some/dir
.检查我的进程是否正在运行是为了确保不会发生重叠的实例,并且我还验证了它是否正常工作。
因此,当我在终端中运行该 cronjob 的代码时,它工作得很好。然而,正如前面所解释的,某些原因导致 cronjob 本身无法按预期运行。当我咨询谷歌关于此类问题时,我发现这个问题关于SO这似乎反映了我的问题,但是对于Linux。我尝试过接受的答案那里指出尝试通过 启动作业xterm
。 IE:
*/1 * * * * . $HOME/.zshrc && xterm -e ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
然而,这并没有什么卵用。同样,通过交互式 shell 运行此 cronjob 的代码按预期工作,但cron
它本身仍然奇怪地运行脚本,唯一的区别是xterm
每分钟都会出现一个窗口。
我很困惑为什么会发生这种情况,我希望脚本能够像从交互式 shell 运行时一样工作。我怎样才能做到这一点以及为什么会cron
以意外的方式运行脚本?