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

时间:2020-03-06 14:43:01  来源:igfitidea点击:

我如何每30分钟运行一次脚本?我认为针对不同的操作系统有不同的方式。我正在使用OSX。

解决方案

在MacOSX上,至少具有以下选项:

  • 带有"运行脚本"操作的周期性iCal警报
  • 发射了
  • cron(链接1,链接2)

从个人经验来看,cron是最可靠的。当我进行测试时,launchd存在许多错误和怪癖。 iCal警报仅在我们登录时运行(但是我们可能更喜欢这种情况)。

只需使用启动。它是一个非常强大的启动器系统,同时它也是Mac OS X的标准启动器系统(如果没有它,当前的OS X版本甚至无法启动)。对于那些不熟悉launchd(或者通常使用OS X)的人来说,它就像initcronat,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,则不行。