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


Answers:


136

只需使用启动。它是一个非常强大的启动器系统,同时也是Mac OS X的标准启动器系统(如果没有它,当前的OS X版本甚至无法启动)。对于那些谁不熟悉launchd(或OS X一般),它就像之间的杂交initcronat,的SysVinit( ),和init.dinetdupstartsystemd。借用所有这些项目的概念,同时还提供您在其他地方可能找不到的东西。

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

系统任务转到

/Library/LaunchDaemons/

是否可以运行,无论是否有任何用户登录到系统。它们将以“ root”特权启动。

如果它们仅在有任何用户登录时运行,则转到

/Library/LaunchAgents/

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

如果它们仅在登录后才能运行,请转到

~/Library/LaunchAgents/

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

请注意,也存在/System/Library/LaunchDaemons/System/Library/LaunchAgents,但像往常一样,一切都在/System由OS X.你管理,不得放置任何文件,在那里,你不得修改任何文件存在,除非你真的知道自己在做什么。在“系统”文件夹中乱七八糟会使您的系统无法使用(将其设置为甚至拒绝再次启动的状态)。这些目录是Apple在其中放置launchd任务的目录,这些任务可以在引导过程中启动并运行系统,根据需要自动启动服务,执行系统维护任务等。

每个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,在这种情况下,参数是文件的路径。或命令可以是启动或停止,以仅启动或停止此类任务,在这种情况下,参数为标签(com.example.my-fancy-task)。也存在其他命令和选项。

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


如果我作为用户希望即使未登录也能运行某些东西怎么办?有可能吗,还是我必须要求管理员在/ Library / LaunchDaemons中放置一些内容?
Mark Ba​​ker

@Mark:是的,您的管理员必须这样做,并且必须在.plist文件中正确设置UserName和GroupName键。
史蒂夫·弗利

另请注意,对于Leopard和更高版本,不建议使用OnDemand,而推荐使用KeepAlive键。有关更多详细信息,请启动launchd.plist。
史蒂夫·弗利

1
LaunchControl soma-zone.com/LaunchControl非常有用,它有无限的试用版,据我所知,与许可版本相比没有任何限制。
BaneOfSerenity

1
@MaciekRekStartCalendarInterval具有两个字典的数组,两个字典的键Minute和值都为一次00和一次,30将完全满足您的要求。以后请以问题而不是评论的形式提出问题,然后我也可以向您展示最终的词典(我不能在评论中这样做)。该网站是所有关于提问的网站。如果您想向某人暗示问题,请将该问题的链接发布为注释,而不是问题本身。
梅基


11

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

  • 使用“运行脚本”操作重复发生iCal警报
  • 发射
  • cron(link1link2

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


7

正如Mecki所指出的,发射将是解决这个问题的方法。您可能需要签出一个用于启动的GUI界面,称为Lingon,而不是手动编辑启动的文件:

Lingon是一个图形用户界面,用于为Mac OS X Leopard 10.5创建编辑启动的配置文件。

[剪...]

在此版本中,配置文件的编辑比以往任何时候都容易,并且它具有两种不同的模式。基本模式具有最简单的界面和专家模式中最常用的设置,您可以在其中直接将所有设置添加到文本中,也可以通过菜单插入它们。


4

MAC OS具有与Windows中的Task Scheduler相同的Automator工具。使用Automator,您可以每天安排任务,并将该任务与重复的日历事件链接起来,以每天在指定时间运行脚本。参考链接以在Mac OS中每天运行脚本


至少在macOS Catalina(10.15.x)中,我找不到通过Automator安排日历中任务的方法。使用Lingon可以得到更好的结果(请参阅作为启动界面提及的其他答案)。
卡尔文夫

2

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


1

仅供参考:虽然我很想念它的简单性,但是cron在OS X上已成为过去。这是在panther上的看门狗。自从Tiger发行以来。因此,如果您正在运行Leopard cron,则不行。


0

您可以使用cron安排任务。

crontab -e

以以下格式指定作业。

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

例:

0 12 * * *  cd ~/backupfolder && ./backup.sh

安装cron任务后,可以使用crontab -l列出任务。

crontab -l

如果您想了解有关cron计划表达式的更多信息,可以访问

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.