为什么在使用vim时,我在OS X上没有crontab条目?

78

我想在我的Mac上使用cron。我选择它而不是launchd,因为我想将新知识应用于Linux。但是,我似乎无法让crontab -e命令工作。它启动了vim,我输入了我的测试任务:

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

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

crontab -l

说道:

No crontab for mollerhoj3

我做错了什么?


保存并退出后,它是否会在终端打印出 crontab: installing new crontab - shx2
退出编辑器时,您完全没有输出吗? - shx2
哦,对不起我说话太含糊了,我的意思是:crontab: no crontab for mollerhoj3DYLD_消息。 - mollerhoj
4
可能的原因是您的vim配置不允许直接编辑文件。请查看https://dev59.com/C2XWa4cB1Zd3GeqPIgC_#11043630以获取修复方法。基本上,输入`:set backupcopy=yes`即可解决问题。我的MacVim由于这个原因不能与crontab一起使用,但我在保存后看到了crontab的警告信息:“crontab: temp file must be edited in place”。 - oligofren
1
此外,可能是因为您正在使用gvim(OP未指定)。 gvim立即返回命令提示符(如果您不使用-f标志),因此crontab不会等待它完成。 - Brian
显示剩余2条评论
14个回答

191

只需按照以下步骤操作:

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

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

  • 输入 ZZ 以退出 vim(必须大写字母)。
  • 您应该会看到以下消息:crontab: installing new crontab。 您可以使用 crontab -l 验证 crontab 文件。
  • 请注意,根据您的 ~/.vimrc 文件的内容,此方法可能无法正常工作。


    13
    在Mac上,您可以使用以下命令将nano设置为默认编辑器:export EDITOR=nano - Hanzaplastique
    7
    @JohnHunt,你可以尝试使用:x,它更短,意思相同。 - Nicklas A.
    2
    一旦您安装了crontab,最近版本的OS X可能仍需要创建/etc/crontab文件以启用cron守护程序。sudo touch /etc/crontab - dansomething
    2
    @NicklasA。ZZ实际上更少的字符,因为您不必按回车键。 - dalore
    10
    @NicklasA 表示,使用小写字母 x 作为加密文件的命令容易与大写字母 X 混淆,他曾经因此在 Unix 上作为新手加密文件时,输入了无法记忆的密码。相比之下,ZZ 命令更安全。请注意,此翻译仅供参考,不保证完全准确。 - Jamie Bowen
    显示剩余6条评论

    74

    我从未遇到过这个问题,但我创建了一个~/.crontab文件并进行编辑(这使我可以备份它,无论是使用Time Machine还是其他方法),然后运行

    crontab ~/.crontab
    

    在许多不同版本的Unix系统上,它已经为我工作了20多年。


    4
    不,你不能。那只会修改当前正在运行的cron使用的指令集;它不会编辑生成这些指令的文件。你可以尝试一下;你会发现cron现在正在使用你编辑过的指令,但是.crontab文件并没有改变。 - Michael Campbell
    6
    这有点误导性。crontab ~/.crontab 只是将文件中的指令安装,它可以被命名为任何名称,都会“起作用”,但 crontab -e 永远不会编辑 ~/.crontab 或你选择的其他文件。请阅读 man crontab。你甚至可以删除 ~/crontab,你的定时任务依旧可以正常运行。 - cmroanirgo
    1
    我在这里没有看到任何误导性的内容。答案明确指出要创建和编辑~/.crontab - Keith Thompson

    42

    注意:使用ZZ命令的答案在我的Mavericks系统上不起作用,但这可能是由于我的vim配置中的某些原因,因为如果我从原始的.vimrc开始,接受的答案就能正常工作。如果其他解决方案无效,则我的答案可能适用于您。

    根据crontab manpage,在MacOS X上,使用crontab -e创建的临时crontab文件需要原地编辑。 Vim默认情况下不支持原地编辑(但它可能会进行一些特殊处理以支持crontab -e),因此如果您的$EDITOR环境变量设置为vi(默认值)或vim,则编辑crontab将始终失败。

    要使Vim可以对文件进行原地编辑,您需要执行以下操作:

    :setlocal nowritebackup
    

    这样做可以使您在执行crontab -e命令时,使用:wqZZ命令更新crontab。

    您可以在您的.vimrc中添加一个自动命令来使其在编辑crontab时自动生效:

    autocmd FileType crontab setlocal nowritebackup
    

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

    ""In ~/.vim/after/ftplugin/crontab.vim
    if has("mac")
      setlocal nowritebackup
    endif
    

    @Dave,这对我没用。我不停地收到这个错误消息:crontab:" /usr/bin/vi " 以状态1退出 - Kshitij Saraogi
    我通过将编辑器从 vi 更改为 vim 来解决了这个问题。我一直以为两者是相同的。 - Kshitij Saraogi
    我注意到当我尝试使用vim编辑OSX上的其他tmp文件时,也会发生这种情况。有人能解释一下OSX或vim处理需要就地修改的tmp文件的特殊方式吗?在阅读关于'writebackup'的文档时,它只是说vim将在覆盖文件之前进行备份。如果它最终覆盖了文件,我不明白为什么它不能正常工作。 - Jeff

    22
    在OS X上使用cron是不被推荐的。相反,应该使用launchd。尝试使用man launchctl来开始。您需要创建特殊的XML文件来定义您的作业,并将它们放在具有特定权限的特定位置。
    通常,您只需要弄清楚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

    我找不到任何表明在OS X上不支持cron的东西。是的,cron已经过时了,但正如我在问题中提到的那样,我有一个想要了解cron的理由。 - mollerhoj
    1
    如果你想在OS X本地平台上学习Linux操作,考虑使用类似VirtualBox(开源虚拟机)的工具,在OS X机器上安装Linux发行版,这样你就可以同时玩弄两者。通过观察它们之间的相似之处和不同之处,你将会学到更多。 - Randy Howard
    25
    巴夫威!你在“你必须创建特殊的XML文件”这句话就把我弄丢了。使用1个cron定时任务命令行要简单得多,而且完全可以胜任。只有在Mac上的cron真正死掉那天我才会去学习launchd。 - Michael M
    7
    我认为使用launchd很困难。 - jwl
    苹果链接已失效。 - blackjacx
    修复了链接! - Andy

    8

    cron与launchd的区别

    正如提到的一样,cron已被弃用(但仍受支持),推荐使用OS X的launchd。

    这段内容摘自developer.apple.com

    睡眠和关机的影响

    如果系统处于关闭或睡眠状态,则不会执行cron任务;直到下一个指定的时间到来才会运行。

    如果通过设置StartCalendarInterval键来安排launchd任务,并且计算机在应该运行任务时处于睡眠状态,则当计算机唤醒时,您的任务将会运行。然而,如果计算机在任务应该运行时关闭,则任务不会执行,直到下一个指定的时间到来。

    所有其他的launchd任务都会在计算机关闭或睡眠时被跳过。它们将不会运行,直到下一个指定的时间到来。

    因此,如果计算机总是在作业的预定时间关闭,那么无论是cron作业还是launchd作业都不会运行。例如,如果您总是在晚上关闭计算机,则在凌晨1点运行的作业将永远不会运行。


    7
    我为了解决这个问题做了两件事:
    1. 我按照这个链接中描述的方法更改了crontab文件:coderwall.com/p/ry9jwg(感谢@Andy)。
    2. 我使用Emacs而不是默认的vim编辑器:EDITOR=emacs crontab -e(我不知道为什么vim无法工作)。
    现在crontab -l可以打印出cronjobs。现在,我只需要弄清楚为什么cronjobs仍然没有运行;-)

    1
    我使用vim编辑crontab没有遇到任何问题(我收到了“crontab:installing new crontab”消息),但是任务没有运行。在Mavericks上,sudo touch /etc/crontab对我有用。 - sjy

    4

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

    正确的cron格式是:

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

    用户字段的语法仅适用于/etc/crontab文件:

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

    正确--但这并不能解释“mollerhoj3没有crontab”的信息。根据问题中的crontab条目,它将尝试执行一个带有参数echo "Hello World"的命令mollerhoj3(当然会失败)。 - Keith Thompson

    2

    另一种选择是完全不使用crontab -e。我使用了以下方法:

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

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


    2
    “crontab: temp file must be edited in place” 错误是由于 vim 处理备份文件的方式导致的。
    要在 cron 中使用 vim,请在您的 .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 时的备份功能。现在可以使用 “crontab -e” 来添加或编辑 cron 任务了。
    当您成功保存 cron 任务时,将会看到以下消息:
    crontab: installing new crontab 来源:
    http://drawohara.com/post/6344279/crontab-temp-file-must-be-edited-in-place 输入链接说明

    1
    由于一些权限问题,之前的帖子对我没有用,我发现创建一个单独的crontab文件,并在root下使用-u参数将其添加到用户的crontab中适用于我。
    sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE}
    

    这不需要使用 sudo。如果您已登录到 USERNAME 帐户,请运行 crontab ~/PATH_TO_CRONTAB_FILE - Keith Thompson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接