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

我想在我的Mac上使用cron。 我select了launchd ,因为我希望能够在Linux上使用我的新知识。 但是,我似乎无法使crontab -e命令工作。 它启动vim,我进入我的testing工作:

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

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

 crontab -l 

说:

 No crontab for mollerhoj3 

我究竟做错了什么?

只需按照以下步骤操作

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

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

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

请注意,这可能无法工作,具体取决于~/.vimrc文件的内容。

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

 crontab ~/.crontab 

已经为我工作了20多年的unix许多口味。

注意使用ZZ命令的答案在我的Mavericks系统上不适用于我,但是这可能是由于我的vimconfiguration中的某些原因,因为如果我以一个原始的.vimrc开头,则接受的答案将起作用。 如果其他解决scheme不适用,我的答案可能适用于您。

在MacOS X上,根据crontab联机帮助页,使用crontab -e创build的crontab临时文件需要就地编辑。 Vim不会默认编辑( 但是可能会做一些特殊情况来支持crontab -e ),所以如果你的$EDITOR环境variables设置为vi (默认)或者vim ,那么编辑crontab总是会失败。

要让Vim在原地编辑文件,你需要做的是:

 :setlocal nowritebackup 

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

您可以在.vimrc中添加一个自动命令,以便在编辑crontabs时自动运行:

 autocmd FileType crontab setlocal nowritebackup 

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

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

不鼓励在OS X上使用cron。 launchd代替。 尝试man launchctl开始。 你必须创build特殊的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

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

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

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

cron和launchd之间的区别

如前所述,cron已被弃用(但支持),推荐在OS X中使用launchd。

这是取自developer.apple.com

睡眠和停电的影响

如果系统closures或睡着,cron作业不会执行; 他们不会运行,直到下一个指定的时间发生。

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

计算机closures或睡着时,所有其他启动的作业都会跳过; 他们不会运行,直到下一个指定的时间发生。

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

在用户crontab( crontab -e )不要把用户字段。

正确的cron是:

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

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

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

由于以前的post由于某些权限问题而不适用于我,我发现创build一个单独的crontab文件并使用-u参数将其添加到用户的crontab,而root为我工作。

 sudo crontab -u {USERNAME} ~/{PATH_TO_CRONTAB_FILE} 

上面有正确答案的组合。 有什么工作对我有完全相同的错误是:

1)编辑你的bashconfiguration文件

$ cd〜&& vim .bashrc

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

导出EDITOR = vim

3)编辑你的vimconfiguration文件

$ cd〜&& vim .vimrc

4)确保在.vimrc中设置backupcopy为yes

设置backupcopy = yes

5)重启terminal

6)现在尝试用crontab编辑

$ crontab -e

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

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

$ crontab -l