79

我想在我的 Mac 上使用 cron。我之所以选择它launchd,是因为我也希望能够在 Linux 上使用我的新知识。但是,我似乎无法让crontab -e命令正常工作。它启动 vim,我进入我的测试工作:

0-59 * * * * mollerhoj3 echo "Hello World"

但是在保存并退出后(:wq),

crontab -l

说:

No crontab for mollerhoj3

我究竟做错了什么?

4

12 回答 12

189

只需按照以下步骤操作:

  1. 在终端:crontab -e.
  2. i进入 vim 的插入模式。
  3. 输入您的 cron 作业,例如:

    30 * * * * /usr/bin/curl --silent --compressed http://example.com/crawlink.php
    
  4. Esc退出 vim 的插入模式。

  5. 键入ZZ退出 vim(必须是大写字母)。
  6. 您应该看到以下消息:crontab: installing new crontab。您可以使用 来验证 crontab 文件crontab -l

但是请注意,根据文件的内容,这可能不起作用~/.vimrc

于 2013-05-24T09:48:24.570 回答
73

我从来没有遇到过这个问题,但我创建了一个 ~/.crontab 文件并编辑它(它允许我备份它,Time Machine 或其他),然后运行

crontab ~/.crontab

已经为我工作了 20 多年,涉及多种风格的 unix。

于 2013-09-15T21:25:13.053 回答
42

注意说使用ZZ命令的答案在我的 Mavericks 系统上对我不起作用,但这可能是由于我的 vim 配置中的某些问题,因为如果我从 pristine 开始.vimrc,则接受的答案有效。如果其他解决方案不起作用,我的回答可能对您有用。

crontab -e在 MacOS X 上,根据 crontab 手册页,需要就地编辑创建的 crontab 临时文件。Vim 默认不就地编辑(但它可能会做一些特殊情况来支持crontab -e),所以如果你的$EDITOR环境变量设置为vi(默认)或vim,编辑 crontab 总是会失败。

要让 Vim 就地编辑文件,您需要执行以下操作:

:setlocal nowritebackup

这应该使您能够在crontab -e使用:wqorZZ命令时更新 crontab。

您可以在 .vimrc 中添加一个自动命令,以使其在编辑 crontab 时自动工作:

autocmd FileType crontab setlocal nowritebackup

另一种方法是添加setlocal nowritebackupto ~/.vim/after/ftplugin/crontab.vim,如果您启用了 Filetype 插件,它将在您编辑 crontab 文件时由 Vim 自动加载。如果您在多个平台上使用 vim 文件,还可以检查操作系统:

""In ~/.vim/after/ftplugin/crontab.vim
if has("mac")
  setlocal nowritebackup
endif
于 2014-01-17T19:22:50.560 回答
22

不鼓励在 OS X 上使用 cron。 launchd改为使用。尝试man launchctl开始。您必须创建特殊的 XML 文件来定义您的作业,并将它们放在具有特定权限的特殊位置。

你通常只需要弄清楚launchctl load

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/launchctl.1.html

http://nb.nathanamy.org/2012/07/schedule-jobs-using-launchd/

编辑

如果您确实想在 OS X 上使用 cron,请查看以下答案:https ://superuser.com/a/243944/2449

于 2013-03-13T20:22:17.080 回答
7

我做了两件事来解决这个问题。

  1. 我触摸了这个链接 coderwall.com/p/ry9jwg中描述的 crontab 文件(感谢@Andy)。
  2. 使用 Emacs 而不是我的默认 vim:(EDITOR=emacs crontab -e我不知道为什么 vim 不起作用)

crontab -l现在打印 cronjobs。现在我只需要弄清楚为什么 cronjobs 仍然没有运行 ;-)

于 2013-03-13T23:11:36.880 回答
6

cron 和 launchd 的区别

如前所述,不推荐使用 cron(但受支持),建议 OS X 使用 launchd。

这取自developer.apple.com

睡眠和关机的影响

如果系统关闭或休眠,cron 作业不会执行;在下一个指定时间出现之前,它们不会运行。

如果您通过设置 StartCalendarInterval 键来安排已启动的作业,并且在作业应该运行时计算机处于睡眠状态,则您的作业将在计算机唤醒时运行。但是,如果在作业本应运行时机器关闭,则作业在下一个指定时间发生之前不会执行。

当计算机关闭或睡眠时,将跳过所有其他已启动的作业;在下一个指定时间出现之前,它们不会运行。

因此,如果计算机始终在作业的预定时间关闭,则 cron 作业和已启动的作业都不会运行。例如,如果您总是在晚上关闭计算机,则计划在凌晨 1 点运行的作业将永远不会运行。

于 2014-03-31T22:38:52.077 回答
4

在用户 crontab ( crontab -e) 中不要放置用户字段。

正确的 cron 是:

0-59 * * * * echo "Hello World"

带有用户字段的语法/etc/crontab仅适用于:

0-59 * * * * mollerhoj3 echo "Hello World"
于 2013-12-23T15:44:38.203 回答
2

该错误crontab: temp file must be edited in place是由于 vim 处理备份文件的方式造成的。

要将 vim 与 cron 一起使用,请在.bash_profile中添加以下行
export EDITOR=vim
alias crontab="VIM_CRONTAB=true crontab"

来源文件:
source .bash_profile

然后在你的.vimrc添加:
if $VIM_CRONTAB == "true" set nobackup set nowritebackup endif

这将在将 vim 与 cron 一起使用时禁用备份。您将能够使用crontab -e添加/编辑 cronjobs。

成功保存 cronjob 后,您将看到以下消息:
crontab: installing new crontab

来源:
http ://drawohara.com/post/6344279/crontab-temp-file-must-be-edited-in-place在此处输入链接描述

于 2018-05-01T05:06:32.080 回答
1

其他选项是根本不使用crontab -e。相反,我使用了:

(crontab -l && echo "1 1  * * *  /path/to/my/script.sh") | crontab -

请注意,您之前打印的任何内容都| crontab -将替换整个 crontab 文件,因此请使用它crontab -l && echo "<your new schedule>"来获取以前的内容和新的计划。

于 2019-10-16T16:10:04.820 回答
0

由于一些权限问题,以前的帖子对我不起作用,我发现创建一个单独的 crontab 文件并使用 -u 参数将其添加到用户的 crontab 中,而 root 对我有用。

sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE}
于 2016-09-13T21:14:16.710 回答
0

以上混合了正确的答案。对我来说有完全相同的错误有用的是:

1)编辑你的bash配置文件

$ cd ~ && vim .bashrc

2)在您的 bash 配置文件中,确保默认编辑器是 vim 而不是 vi(这会导致问题)

导出编辑器=vim

3)编辑你的vim配置文件

$cd ~ && vim .vimrc

4) 确保 set backupcopy 在你的 .vimrc 中是 yes

设置备份复制=是

5)重启终端

6) 现在尝试 crontab 编辑

$ crontab -e

10 * * * * 回声“你好世界”

您应该看到它正确地创建了 crontab 文件。如果您退出 vim(ZZ 或 :wq)并使用以下命令列出 crontab;您应该会看到新的 cron 作业。希望这可以帮助。

$ crontab -l

于 2016-11-29T11:50:27.113 回答
0

使用其他文本编辑器

env EDITOR=nano crontab -e 

或者

env EDITOR=code crontab -e 
于 2020-01-01T17:20:20.023 回答