我如何设置一个任务经常运行?

我怎样才能让脚本跑30分钟? 我假设不同的操作系统有不同的方法。 我正在使用OS X.

只要使用launchd 。 这是一个非常强大的启动器系统,同时它是Mac OS X的标准启动器系统(目前的OS X版本甚至不会启动没有它)。 对于那些不熟悉launchd (或一般OS X)的人来说,它就像initcronat ,SysVinit( init.d ), inetdupstartsystemd之间的杂交。 借用所有这些项目的概念,但也提供你可能在别处找不到的东西。

每个服务/任务都是一个文件。 该文件的位置取决于以下问题:“该服务应该何时运行?” 和“服务需要哪些特权?”

系统任务去

 /Library/LaunchDaemons/ 

如果他们运行,不pipe是否有用户login到系统。 他们将以“根”权限开始。

如果他们只有在任何用户login的情况下才会运行,他们会去

 /Library/LaunchAgents/ 

并将以刚刚login的用户的特权执行。

如果他们只在login时运行,他们会去

 ~/Library/LaunchAgents/ 

哪里〜是你的HOME目录。 这些任务将以您的权限运行,就像您自己通过命令行启动它们或双击Finder中的文件一样。

请注意,还存在/System/Library/LaunchDaemons/System/Library/LaunchAgents ,但像往常一样, /System下的所有内容都由OS Xpipe理。不得在其中放置任何文件,你真的知道你在做什么。 在“系统”文件夹中发生的混乱可能会使您的系统无法使用(使其进入甚至会拒绝启动的状态)。 这些是Apple放置launchd任务的目录,可以在启动过程中启动并运行系统,根据需要自动启动服务,执行系统维护任务等。

每个launchd任务都有一个plist格式的文件。 它应该有反向域名表示法。 例如,你可以命名你的任务

 com.example.my-fancy-task.plist 

这plist可以有各种选项和设置。 每手写一篇都不是最理想的,你可能想要免费的Lingon工具来创build你的任务。 这个工具以前是免费的,现在它在app store中的价格是5美元,非app store的价格是10美元(非app store的版本更加强大,如果你已经计划付费,那么认真的做非app store版)。 如果有人知道免费软件或开放源代码的可比较的工具,请在评论中给我留言,我宁愿推荐一个(不想在这里做商业软件广告)。

就像一个例子,它可能看起来像这样

 <?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。 你也可以在特定的date/时间运行任务(基本上启动可以做一切cron可以做的),或者你甚至可以禁用“OnDemand”,导致launchd保持进程永久运行(如果它退出或崩溃,launchd将立即重新启动) 。 你甚至可以限制一个进程可以使用多less资源(如前所述,Lingon在一个不错的UI界面中显示所有这些设置)。

更新: 尽pipeOnDemand仍受支持,但不推荐使用。 新的设置被命名为KeepAlive ,这更有意义。 它可以有一个布尔值,在这种情况下,它是OnDemand的完全相反(将其设置为false行为就像OnDemandtrue ,反之亦然)。 伟大的新function是,它也可以有一个字典值,而不是一个布尔值。 如果它有一个字典值,那么你有两个额外的选项,让你更好的粮食控制在哪些情况下,任务应保持活着。 例如,只要程序以退出代码0结束,只有在磁盘上存在某个文件/目录时,只有当另一个任务还活着时,或者只有在networking当前运行时,它才会保持活动状态。

您也可以通过命令行手动启用/禁用任务:

 launchctl <command> <parameter> 

命令可以加载或卸载,加载plist或再次卸载,在这种情况下,参数是文件的path。 或者命令可以是开始或停止,只是启动或停止这样一个任务,在这种情况下参数是标签(com.example.my-fancy-task)。 其他命令和选项也存在。

请参阅Apple的plist格式文档和launchctl命令行工具 (请注意,您可以select顶部的OS X版本,因为格式/选项在不同的OS X版本之间会有所不同)

你可以使用非常方便的plist发生器: http : //launched.zerowidth.com/ (不需要购买任何东西…)

它将为您提供一个shell,用已经推荐的launchd注册一个新的计划任务

在MacOSX上,您至less有以下选项:

  • 使用“运行脚本”操作重复出现iCal警报
  • 的launchd
  • cron( link1 , link2 )

从个人经验来看,cron是最可靠的。 当我testing时,launchd有一些bug和怪癖。 iCal警报仅在您login时运行(但这可能是您更喜欢的)。

正如Mecki所指出的那样,推出将是这条路。 有一个名为Lingon的 launchd的GUI界面,你可能想看看,而不是手工编辑launchd文件:

Lingon是一个graphics用户界面,用于为Mac OS X Leopard 10.5创build编辑启动的configuration文件。

[剪断…]

在这个版本中编辑configuration文件比以前更容易,它有两种不同的模式。 具有最常见设置的基本模式可以通过非常简单的界面和专家模式轻松获得,您可以直接在文本中添加所有设置,也可以通过菜单插入。

对于苹果脚本,我设置了一个特殊的iCal日历,并使用警报定期运行。 对于命令行工具,我使用launchd。

仅供参考:虽然我错过了它的siplicity,但是cron在OS X上是过去的事情。它是黑豹的看门狗。 自从Tiger推出后, 所以如果你正在运行豹cron不是一个选项。

Mac有一个Automator工具,它与Windows中的任务计划程序相同。 但是使用Automator,您可以每天安排一项任务,并将任务与定期日历事件关联起来,以每天在指定时间运行脚本。 请参阅链接以在Mac OS上每日运行脚本