在Mac上使用cronjobs入门指南

7
我正在尝试熟悉cron jobs,我认为我已经掌握了基本思路(调度、语法等),但是在我的mac上的终端中似乎无法正确使用——我应该在哪里找到Crontab?我该如何引用脚本路径?
我想要做的是访问远程机器上的一个php脚本(http://..)。这是否可能?
6个回答

10

输入crontab -e来编辑您的cron表,输入crontab -l来列出当前内容。输入man 1 crontab以获取有关该命令的更多信息,输入man 5 crontab以获取有关cron表文件格式的更多信息。

例如,要在每天上午10:00下载stackoverflow页面,请运行crontab -e,输入此行,然后保存/退出。输出将写入您的主目录中的文件。

0 10 * * * /usr/bin/curl -s http://stackoverflow.com > ~/stackoverflow.html

6
要开始使用launchd(而不是cron),您需要首先创建一个空的.plist文件,例如local.mytask.plist,并将其放在某个位置。~/Library/LaunchAgents可能是一个不错的选择。在文本编辑器中打开它并复制下面的代码。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<false/>
<key>Label</key>
<string>local.mytask</string>
<key>ProgramArguments</key>
<array>
<string>/opt/local/bin/wget</string>
<string>http://someserver/somepage.php</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
<key>RunAtLoad</key>
<true />
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>StandardOutPath</key>
<string>/dev/null</string>
</dict>
</plist>

然后在命令行中“激活”该文件:

sudo launchctl load /Users/my_username/Library/LaunchAgents/local.mytask.plist

为了使它自动加载,创建一个 ~/.launchd.conf 文件,其中包含相同的行(不包括 sudo launch)。
load /Users/my_username/Library/LaunchAgents/local.mytask.plist

上述指令已从www.davidlanier.com复制并在此转载,以供参考。

谢谢大家,你们的回答都非常有帮助。 最终我手动使用了Launchd(Lingon在语法方面也很有帮助)。请注意,在Mac上默认情况下无法使用wget,因此我改用了curl: <array> <string>/usr/bin/curl</string> <string>-s</string> <string>http://myserver.com/myscript.php</string> </array> - Adam
我注意到当文件实际位于 /Users/my_username/Library/LaunchAgents/local.mytask.plist 时,即使没有 ~/.launchd.conf,它也会在登录时自动加载。 - commonpike

4

假设还有其他人在Snow Leopard上处理cron的问题,我将重新梳理一下这个老旧的主题。

是的,launchd应该取代cron,但实际上它无法完成cron可以完成的某些操作。

cron的集成效果不佳。如果它发送了一条消息,那么它最终会出现在/var/mail/user_name中,当然,Apple Mail对此一无所知。

使用crontab -e会提示“必须在原地编辑临时文件”。显然vim不兼容vi。然后你可以执行 crontab "< /tmp/crontab.whatever"(查看/tmp并查看实际使用的名称),它就会出现在正确的位置,并且假设你没有打错字,它也会正常工作。

是的,要解决所有这些问题确实需要一段时间 :(


3

launchd是非常强大的,但您真的不希望自己编写 plist 文件。请尝试使用Lingon。它是一个开源、设计良好的 GUI 工具,用于创建和管理系统的 launchd 任务。


虽然Lingon仍然非常有用和可用,但请注意开发者已宣布放弃进一步开发。 - Ned Deily

1

自10.4版本起,Cron已被launchd替代。除非您计划在某个时候将它们移植到Linux/Unix系统上,否则您应该使用这个来编写您的任务。

如果您仍然决定使用cron,请尝试输入crontab -esudo crontab -e。这将为您提供不同的crontab文件,前者是当前正在运行的用户,后者是root用户。

“击中”URL可以通过许多方式实现。根据您使用的本地脚本来“击中”它,您可以使用一些语言内置的方法/类。例如,Ruby脚本将使用net/http,但如果您只是编写一个bash脚本,也可以尝试使用curl。键入man curl以了解更多信息,但基本命令只是curl http://google.com


1
cron在10.4及以上版本中默认未运行,您需要先启用它。从记忆中,crond manpage显示了如何执行此操作。 - saschabeaumont
+1 很好知道。我甚至没有想到它会被禁用。 - Topher Fangio
1
据我所知,OS X中的cronjobs是通过launchd实现的,因此差异可能无关紧要... - Benjamin Oakes
@Benjamin Oakes - 很有趣,我没有太多处理它的经验,所以在我的答案中可能使用了错误的术语(例如“替换”)。感谢你澄清。 - Topher Fangio

0

你不再需要使用cron了。正如其他人所说,它已被launchd取代,并且在Mac OS X上,launchd显然将是未来。

MacTech杂志最近一直在撰写关于launchd的系列文章,我强烈建议阅读它们。我知道我肯定学到了很多。

2009年9月(第25卷,第9期) 25.09 MacEnterprise:午餐时间的launchd

2009年10月(第25卷,第10期) Snow Leopard、Launchd和午餐 更多的launchd配方,以及Snow Leopard中的变化

MacTech还有其他文章,我建议在他们的网站上搜索。


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