为什么在使用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
我究竟做错了什么?
只需按照以下步骤操作
- 在terminal中:
crontab -e
。 - 按i进入vim的插入模式。
-
input您的cron作业,例如:
30 * * * * /usr/bin/curl --silent --compressed http://example.com/crawlink.php
-
按Esc键退出vim的插入模式。
- 键入ZZ退出vim(必须是大写字母)。
- 您应该看到以下消息:
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
这应该使您能够在使用:wq
或ZZ
命令执行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://nb.nathanamy.org/2012/07/schedule-jobs-using-launchd/
编辑
如果你真的想在OS X上使用cron,看看这个答案: https : //superuser.com/a/243944/2449
我做了2件事来解决这个问题。
- 我触摸了这个链接coderwall.com/p/ry9jwg (谢谢@Andy)描述的crontab文件。
- 使用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