我想在我的 Mac 上使用 cron。我选择它而不是 launchd,因为我也希望能够使用我在 Linux 上的新知识。然而,我似乎无法让 crontab -e命令工作。它激发了我的活力,我进入了我的测试工作:
launchd
crontab -e
0-59 * * * * mollerhoj3 echo "Hello World"
但是在储蓄和退出之后(:wq) ,
:wq
crontab -l
他说:
No crontab for mollerhoj3
我做错了什么?
不鼓励在 OS X 上使用 cron。取而代之的是 launchd。尝试 man launchctl开始。您必须创建定义作业的特殊 XML 文件,并将它们放在具有特定权限的特殊位置。
man launchctl
你通常只需要算出 launchctl load
launchctl load
Https://www.unix.com/man-page/osx/1/launchctl/
Http://nb.nathanamy.org/2012/07/schedule-jobs-using-launchd/
剪辑
如果您真的想在 OS X 上使用 cron,请查看以下答案: https://superuser.com/a/243944/2449
我做了两件事来解决这个问题。
EDITOR=emacs crontab -e
crontab -l现在打印 cronjob。现在我只需要弄清楚为什么 cronjob 仍然没有运行; -)
只要按照以下步骤:
输入 cron 作业,例如:
30 * * * * /usr/bin/curl --silent --compressed http://example.com/crawlink.php
Press Esc to exit vim's insert mode.
crontab: installing new crontab
Note however that this might not work depending on the content of your ~/.vimrc file.
~/.vimrc
我从来没有这个问题,但我创造了一个 ~/。然后编辑 crontab 文件(这允许我备份它,时间机器或其他) ,然后运行
crontab ~/.crontab
已经为我工作了20多年,涉及多种 Unix 风格。
在用户 crontab (crontab -e)中不要放置用户字段。
正确的 cron 是:
0-59 * * * * echo "Hello World"
带用户字段的语法仅适用于 /etc/crontab:
/etc/crontab
注意 : < em > 说使用 ZZ命令的答案在我的 Mavericks 系统上不起作用,但这可能是由于我的 vim 配置中的一些问题,因为如果我从一个原始的 .vimrc开始,接受的答案就起作用了。如果另一个解决方案不起作用,我的答案也许对你有用。
ZZ
.vimrc
在 MacOSX 上,根据 crontab 页面,需要就地编辑用 crontab -e创建的 crontab 临时文件。缺省情况下,Vim 不会就地编辑(但它可能会做一些特殊情况下支持 crontab -e) ,所以如果你的 $EDITOR环境变量设置为 vi(缺省情况下)或者 vim,编辑 crontab 总是会失败。
$EDITOR
vi
vim
要让 Vim 就地编辑文件,您需要:
:setlocal nowritebackup
这将使您能够在使用 :wq或 ZZ命令执行 crontab -e时更新 crontab。
您可以在.vimrc 中添加一个自动命令,以便在编辑 crontab 时自动工作:
autocmd FileType crontab setlocal nowritebackup
另一种方法是将 setlocal nowritebackup添加到 ~/.vim/after/ftplugin/crontab.vim,如果启用了 Filetype 插件,当您编辑 crontab 文件时,Vim 将自动加载 setlocal nowritebackup。如果你在多个平台上使用你的 vim 文件,你也可以检查操作系统:
setlocal nowritebackup
~/.vim/after/ftplugin/crontab.vim
""In ~/.vim/after/ftplugin/crontab.vim if has("mac") setlocal nowritebackup endif
正如前面提到的,cron 不被推荐使用(但是支持) ,并且推荐在 OS X 中使用 launchd。
这是从 Developer.apple.com拍的
如果系统已关闭或处于睡眠状态,则 cron 作业将不会执行; 它们将不会运行,直到下一个指定时间发生。
如果通过设置 StartCalendarInterval 键来安排启动作业,并且在作业应该运行时计算机处于睡眠状态,则在计算机唤醒时将运行该作业。但是,如果在作业应该运行时计算机关闭,则作业将直到下一个指定时间才执行。
当计算机关机或处于休眠状态时,将跳过所有其他启动作业; 它们将在下一个指定时间之前不会运行。
因此,如果计算机总是在作业的预定时间关闭,则 cron 作业和 launchd 作业都不会运行。例如,如果您总是在晚上关闭计算机,计划在凌晨1点运行的作业将永远不会运行。
由于一些权限问题,前面的文章对我来说不起作用,我发现创建一个单独的 crontab 文件并使用-u 参数将其添加到用户的 crontab 中,而 root 对我来说起作用了。
sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE}
以上的答案都是正确的,对我来说最有效的方法是:
1)编辑 bash 配置文件
$cd ~ & vim. bashrc
2)在 bash 配置文件中,确保默认编辑器是 vim 而不是 vi (这会导致问题)
出口编辑 = vim
3)编辑你的 vim 配置文件
$cd ~ & vim. vimrc
4)确保.vimrc 中的 set backupcopy 是 yes
是的
5)重新启动终端
6)现在试试 crontab edit
$crontab-e 10分钟后回声“你好世界”
$crontab-e
10分钟后回声“你好世界”
您应该看到它正确地创建了 crontab 文件。如果退出 vim (ZZ 或: wq)并使用以下命令列出 crontab,则应该会看到新的 cron 作业。希望这个能帮上忙。
$crontab-l
错误 crontab: temp file must be edited in place是因为 vim 处理备份文件的方式。
crontab: temp file must be edited in place
若要将 vim 与 cron 一起使用,请在 . bash _ profile中添加以下代码行 export EDITOR=vim alias crontab="VIM_CRONTAB=true crontab"
export EDITOR=vim
alias crontab="VIM_CRONTAB=true crontab"
来源文件: source .bash_profile
source .bash_profile
然后在你的 。 vimrc里加上: 如果 $VIM _ CRONTAB = = “ true” 不要设置备份 设置 now-write 备份 Endf
如果 $VIM _ CRONTAB = = “ true” 不要设置备份 设置 now-write 备份 Endf
这将在使用 vim 和 cron 时禁用备份,并且您将能够使用 crontab -e来添加/编辑 cronjob。
当你成功地挽救了你的错误工作,你会看到这样的信息: crontab: installing new crontab
来源: Http://drawohara.com/post/6344279/crontab-temp-file-must-be-edited-in-place 在这里输入链接描述
另一种选择是根本不使用 crontab -e,而是使用:
(crontab -l && echo "1 1 * * * /path/to/my/script.sh") | crontab -
请注意,在 | crontab -之前打印的内容将替换整个 crontab 文件,因此使用 crontab -l && echo "<your new schedule>"获取以前的内容和新的日程安排。
| crontab -
crontab -l && echo "<your new schedule>"
使用另一个文本编辑器
env EDITOR=nano crontab -e
或者
env EDITOR=code crontab -e
@ Hanzaplasque 答案 在这个评论中为我工作: export EDITOR=nano
export EDITOR=nano
免责声明: 我不是 Mac 用户。然而,我在 Linux 和类似的系统上使用了很多 crontab。我假设 Mac 上的 crontab 工作原理类似。
许多答案和评论建议使用 Vim 以外的编辑器。没关系,但没有理由不让 Vim 起作用。
cron系统为每个用户维护一个 crontab。该文件的位置并不重要; 只有 crontab实现需要了解它。cron提供了一个接口,允许用户请求更新他们自己的 crontab。
cron
crontab
crontab -e命令执行以下步骤:
$VISUAL
当您使用 vim编辑器编辑文件时,通常会创建一个具有相同名称的新文件。这不重要.crontab -e命令创建一个临时文件,等待用户编辑它,然后重新读取临时文件 名字。它不会在用户编辑临时文件时保持打开状态。如果 Mac crontab 实现做到了这一点,我会认为它存在漏洞。我还注意到,原始的海报没有提到“ crontab: temp 文件必须在适当的地方进行编辑”消息; 这是在评论中提到的。
我能想到的最合理的解释是 OP 使用了 gvim或类似的东西。gvim是 vim的 GUI 版本,如果您从 shell 提示符调用它,您将立即得到一个新的提示符; 它启动一个在后台运行的 GUI 编辑器。如果您使用 crontab -e并且它尝试使用 gvim编辑临时文件,那么 crontab将看到编辑器命令立即终止,并且不会看到任何更新。
gvim
事实上,我可以通过调用
VISUAL=gvim EDITOR=gvim crontab -e
(再次声明,我不是一个 Mac 用户,可能有一些 Mac 特有的怪异之处我没有发现。)
许多其他的回答和评论建议使用不同的编辑器。没这个必要。任何正常工作的文本编辑器都应该使用 crontab -e——只要编辑器命令在临时文件更新之后才终止。我一直使用 vim (或 vi 或 nvi)作为默认编辑器,并且在使用 crontab 时从未遇到过问题。
问题中的 crontab 行:
前5个字段指定计划,第6个字段是用户名。普通用户 crontab 没有第6个字段,因为 crontab命令会跟踪所有者(运行 crontab命令的帐户)。99% 的情况下,您不需要担心系统 crontab。甚至 root也可以使用 crontab命令为 root帐户安装用户 crontab。但是,这本身并不能解释 OP 所看到的问题; 语法对于用户 crontab 是有效的,但是它将尝试使用参数 echo "Hello World"调用一个名为 mollerhoj3的命令。这将在调度命令时导致错误,而不是在创建或更新 crontab 时导致错误。
root
echo "Hello World"
mollerhoj3
最后,还有一点没有回答最初问题的建议。使用 crontab -e可能有点危险,因为它很容易损坏或破坏您的 crontab 无意。相反,我建议在主目录中保存一个文件(可能在版本控制系统中维护) ,并使用 crontab filename应用该文件的内容。例如,您可以创建和编辑 $HOME/.crontab,并在更新后运行 crontab $HOME/.crontab。
crontab filename
$HOME/.crontab
crontab $HOME/.crontab
问题是超过9岁,但原始海报仍然或多或少活跃(但可能没有相同的系统)。