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


77

我想在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 2013年

所以当退出编辑器时,您根本没有输出?
shx2 2013年

哦,是的,因为如此神秘,很抱歉,我得到:crontab: no crontab for mollerhoj3DYLD_消息
mollerhoj 2013年

3
原因可能是您的vim配置为不就地编辑文件。有关修复程序,请参见stackoverflow.com/a/11043630/200987。基本上:set backupcopy=yes。由于这个原因,我的MacVim无法与crontab配合使用,但是由于crontab保存后抱怨,我看到了它crontab: temp file must be edited in place
oligofren

另外,这可能是因为您使用的是gvim(OP未指定)。gvim立即返回命令提示符(如果您不使用-f标志),因此crontab不会等待其完成,
Brian Brian

Answers:


185

只需按照以下步骤操作:

  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文件的内容,这可能不起作用。


40
ZZ ..不知道哪一个远远优于:wq!
约翰·亨特

12
在Mac上,您可以使用以下方法将nano设置为默认编辑器:export EDITOR=nano
Hanzaplastique 2013年

7
@JohnHunt您应该尝试:x,减少字符数:)
Nicklas A.

2
@Nicklas但是输入起来比较复杂。您必须在半途中释放Shift键。
约翰·亨特2013年

10
@NicklasA:x冒着与:X混淆的风险-作为noob unix dud几次,我加密了文件,却不知道我作为加密密钥输入的内容退出了!ZZ似乎更安全:-)
杰米·鲍恩

73

我从来没有遇到过这个问题,但是我创建了〜/ .crontab文件并对其进行编辑(这使我可以使用Time Machine或其他方式对其进行备份),然后运行

crontab ~/.crontab

已经为我工作了20多年,涉及多种Unix版本。


4
@Rohmer不,你不能。所有要做的就是修改您的cron使用的当前正在运行的指令集;它不会编辑这些指令来自的文件。尝试一下; 您会看到cron现在正在使用您编辑过的说明,但是.crontab并未更改。
Michael Campbell

6
这有点误导。crontab ~/.crontab只需将指令安装在文件中。可以将其命名为任何名称,并且可以“运行”,但crontab -e永远不会编辑~/.crontab或选择任何文件。阅读man crontab。您甚至可以删除,~/crontab并且您的任务清单也可以正常运行。
cmroanirgo'2

40

注意在我的Mavericks系统上,说使用ZZ命令的答案对我不起作用,但这可能是由于我的vim配置中有问题,因为如果我以原始方式开头.vimrc,那么可接受的答案就可以了。如果其他解决方案不起作用,我的答案可能对您有用。

在MacOS X上,根据crontab联机帮助页,使用创建的crontab临时文件crontab -e需要就地进行编辑。Vim默认情况下不进行就地编辑(但可能会做一些特殊情况来支持crontab -e),因此,如果您的$EDITOR环境变量设置为vi(默认值)或vim,则编辑crontab总是会失败。

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

:setlocal nowritebackup

这样可以使您在crontab -e使用:wqorZZ命令时更新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

4
感谢您回答这个问题,这个问题实际上并没有。我遇到了与Vim相同的问题,您是正确的,这与它的就地编辑有关。
比尔

@Dave这对我不起作用。我不断收到此错误消息:crontab: "/usr/bin/vi" exited with status 1
Kshitij Saraogi '17

我通过将编辑器从更改为vi来修复它vim。我一直以为两者都是一样的。
Kshitij Saraogi

我注意到当我也尝试使用vim在OSX上编辑其他tmp文件时,会发生这种情况。有人可以解释一下OSX或vim如何处理需要就地修改的tmp文件的特殊之处吗?阅读有关“ writebackup”的文档时,它只是说vim将在覆盖文件之前进行备份。如果它最终覆盖了文件,我不明白为什么它不能正常工作。
杰夫

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


我找不到任何表明OS X不支持cron的信息。是的,cron被描述了,是的,但是正如我在问题中提到的,我有一个想了解cron的理由。
mollerhoj 2013年

1
如果您想学习在OS X本机平台上的Linux操作,请考虑使用VirtualBox(开放源VM)之类的东西在OS X计算机上的VM中安装Linux发行版,以便您可以同时使用两者。看到它们之间的异同,您将学到更多。
兰迪·霍华德

24
巴富维!您在“您必须创建特殊的XML文件”中迷失了我。1条crontab行要简单得多,并且工作正常。我将学习在Mac上的cron实际已死的那一天启动。
2013年

7
发射是使用恕我直言的噩梦
jwl

7

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

  1. 我触摸了crontab文件,此链接coderwall.com/p/ry9jwg中描述了该文件 (感谢@Andy)。
  2. 用Emacs代替了我的默认vim :(EDITOR=emacs crontab -e我不知道为什么vim无法正常工作)

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


1
+1可以更改编辑器crontab -e,这很容易知道
StartupGuy

1
我用vim编辑crontab没问题(我收到crontab: installing new crontab消息),但是作业没有运行。sudo touch /etc/crontab在小牛上为我工作..
sjy 2014年

6

cron和launchd之间的区别

如前所述,不建议使用cron(但受支持),建议在OS X中启动cron。

这取自developer.apple.com

睡眠和断电的影响

如果系统关闭或处于睡眠状态,则cron作业不会执行;在下一个指定时间发生之前,它们不会运行。

如果通过设置StartCalendarInterval键安排启动的作业,并且本应运行该作业的计算机处于睡眠状态,则该作业将在计算机唤醒时运行。但是,如果在应运行该作业的情况下关闭了机器,则该作业要等到下一个指定时间出现后才能执行。

关闭计算机或使其进入睡眠状态时,将跳过所有其他已启动的作业。在下一个指定时间发生之前,它们不会运行。

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


1
这实际上是解决问题而不是切向vim主题。
Cheezmeister

@Cheezmeister:这是夸奖还是抱怨?;)
Arthaey 2015年

4

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

正确的cron为:

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

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

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

1

该错误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在这里输入链接描述


0

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

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

0

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

1)编辑您的bash配置文件

$ cd〜&& vim .bashrc

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

导出EDITOR = vim

3)编辑您的vim配置文件

$ cd〜&& vim .vimrc

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

设置backupcopy = yes

5)重启终端

6)现在尝试crontab编辑

$ crontab -e

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

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

$ crontab -l


0

完全不使用其他选项crontab -e。相反,我使用了:

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

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


0

使用其他文字编辑器

env EDITOR=nano crontab -e 

要么

env EDITOR=code crontab -e 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.