如何设置一个经常运行的任务?
我如何每30分钟运行一次脚本?我认为针对不同的操作系统有不同的方式。我正在使用OSX。
解决方案
在MacOSX上,至少具有以下选项:
- 带有"运行脚本"操作的周期性iCal警报
- 发射了
- cron(链接1,链接2)
从个人经验来看,cron是最可靠的。当我进行测试时,launchd存在许多错误和怪癖。 iCal警报仅在我们登录时运行(但是我们可能更喜欢这种情况)。
只需使用启动。它是一个非常强大的启动器系统,同时它也是Mac OS X的标准启动器系统(如果没有它,当前的OS X版本甚至无法启动)。对于那些不熟悉launchd
(或者通常使用OS X)的人来说,它就像init
,cron
,at
,SysVinit(init.d
),inetd
之间的杂种, upstart和systemd。借用所有这些项目的概念,同时还提供我们在其他地方可能找不到的东西。
每个服务/任务都是一个文件。文件的位置取决于以下问题:"该服务应在何时运行?"和"服务需要哪些特权?"
系统任务转到
/Library/LaunchDaemons/
是否可以运行,无论是否有任何用户登录到系统。它们将以" root"特权启动。
如果仅当有任何用户登录时它们将运行,则转到
/Library/LaunchAgents/
并以刚刚登录的用户的特权执行。
如果它们仅在我们登录后才能运行,请转到
~/Library/LaunchAgents/
〜是HOME目录。这些任务将以特权运行,就像我们是通过命令行或者双击Finder中的文件自己启动它们一样。
请注意,还存在/ System / Library / LaunchDaemons
和/ System / Library / LaunchAgents
,但通常,/ System下的所有内容均由OS X管理。更改那里的任何文件,除非我们真的知道自己在做什么。在"系统"文件夹中乱七八糟可能会使系统无法使用(使其进入甚至拒绝再次启动的状态)。这些目录是Apple放置启动任务的目录,这些任务可以在引导过程中启动并运行系统,根据需要自动启动服务,执行系统维护任务等等。
每个launchd
任务都有一个plist格式的文件。它应该具有反向域名表示法。例如。你可以命名你的任务
com.example.my-fancy-task.plist
此plist可以具有各种选项和设置。每手书写一个不是最理想的,我们可能需要免费的Lingon工具来创建任务。该工具以前是免费的,现在在应用商店中的售价为5美元,非应用商店的版本为10美元(非应用商店的版本功能更强大,如果我们已经打算为此付费,请认真获取非应用商店的价格版本)。如果有人知道免费软件或者开放源代码的可比工具,请在评论中给我一行,我宁愿推荐一个(不想在这里为商业软件做广告)。
举个例子,它看起来可能像这样
<?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>Label</key> <string>com.example.my-fancy-task</string> <key>OnDemand</key> <true/> <key>ProgramArguments</key> <array> <string>/bin/sh</string> <string>/usr/local/bin/my-script.sh</string> </array> <key>StartInterval</key> <integer>1800</integer> </dict> </plist>
该代理将每1800秒(每30分钟)运行一次shell脚本/usr/local/bin/my-script.sh。我们还可以在特定日期/时间运行任务(基本上启动可以执行cron可以做的所有事情),或者甚至可以禁用" OnDemand",导致启动使进程保持永久运行(如果退出或者崩溃,启动将立即重新启动它) 。我们甚至可以限制一个进程可以使用多少资源(如前所述,Lingon在漂亮的UI界面中显示了所有这些设置)。
更新:即使仍然支持OnDemand
,它已被弃用。新设置名为KeepAlive
,这更有意义。它可以具有布尔值,在这种情况下,它与OnDemand完全相反(将其设置为false的行为就像OnDemand为true一样)。伟大的新功能是,它也可以具有字典值而不是布尔值。如果它具有字典值,则我们有几个额外的选项,可以使我们在这种情况下可以更好地控制任务的运行。例如。只要程序以退出代码为零终止,它就一直保持活动状态;只要磁盘上存在某个文件/目录,则另一个任务也处于活动状态,或者当前网络已启动,则程序才保持活动状态。
我们也可以通过命令行手动启用/禁用任务:
launchctl <command> <parameter>
可以加载或者卸载命令,以加载plist或者再次卸载plist,在这种情况下,参数是文件的路径。或者命令可以是启动或者停止,以仅启动或者停止此类任务,在这种情况下,参数为标签(com.example.my-fancy-task)。也存在其他命令和选项。
请参阅Apple的plist格式和launchctl
命令行工具的文档(请注意,我们可以选择顶部的OS X版本,因为格式/选项在不同的OS X版本之间会有所不同)
对于Apple脚本,我设置了特殊的iCal日历,并使用警报定期运行它们。对于命令行工具,我使用launchd。
正如Mecki所指出的,发射将是解决这个问题的方法。我们可能需要签出一个用于启动的GUI界面,称为Lingon,而不是手动编辑启动的文件:
Lingon is a graphical user interface for creating an editing launchd configuration files for Mac OS X Leopard 10.5. [snip...] Editing a configuration file is easier than ever in this version and it has two different modes. Basic Mode which has the most common settings readily available in a very simple interface and Expert Mode where you can add all settings either directly in the text or insert them through a menu.
仅供参考:虽然我确实很想念它的简单性,但是cron在OS X上已经成为过去。这在panther上是看门狗。自从Tiger发行以来。因此,如果我们运行的是Leopard cron,则不行。