如何将任务设置为每隔一段时间运行一次?

时间:2008-09-25 12:20:01

标签: macos shell time cron scheduled-tasks

如何每隔30分钟运行一次脚本?我假设不同的操作系统有不同的方法。我正在使用OS X.

8 个答案:

答案 0 :(得分:108)

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

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

系统任务转到

systemd

如果他们应该运行,无论是否有用户登录到系统。它们将以“root”权限启动。

如果他们只在任何用户登录时才会运行,他们会转到

/Library/LaunchDaemons/

将使用刚刚登录的用户的权限执行。

如果只有登录时才会运行,他们会转到

/Library/LaunchAgents/

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

请注意,还存在~/Library/LaunchAgents/ /System/Library/LaunchDaemons,但通常情况下,/System/Library/LaunchAgents下的所有内容都由OS X管理。您不得在此处放置任何文件,不得更改任何文件那里的文件,除非你真的知道你在做什么。在Systems文件夹中乱搞可能会使您的系统无法使用(使其进入甚至拒绝再次启动的状态)。这些是Apple放置/System任务的目录,这些任务使您的系统在启动期间启动并运行,根据需要自动启动服务,执行系统维护任务等。

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

launchd

此plist可以有各种选项和设置。每手写一个是不理想的,你可能想要获得免费工具Lingon来创建你的任务。这个工具过去是免费的,现在它在应用程序商店中的价格是5美元,而非应用程序商店版本的价格是10美元(非应用程序商店版本功能更强大,如果你已经计划付费,那么,请认真购买非应用程序商店版)。如果有人知道一个类似的免费软件或开源工具,请在评论中写一行,我宁愿推荐一个(不想在这里做商业软件广告)。

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

com.example.my-fancy-task.plist

此代理将每1800秒(每30分钟)运行一次shell脚本/usr/local/bin/my-script.sh。您还可以在某些日期/时间运行任务(基本上启动可以执行cron可以执行的所有操作),或者您甚至可以禁用“OnDemand”导致launchd保持进程永久运行(如果它退出或崩溃,launchd将立即重新启动它) 。您甚至可以限制进程可以使用的资源量(如前所述,Lingon在一个漂亮的UI界面中显示所有这些设置)。

更新: 尽管仍支持<?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> ,但已弃用。新设置名为OnDemand,这更有意义。它可以有一个布尔值,在这种情况下,它与KeepAlive完全相反(将其设置为OnDemand的行为就好像falseOnDemand而反之亦然。伟大的新功能是,它也可以有一个字典值而不是布尔值。如果它有一个字典值,你有几个额外的选项可以让你更精细地控制颗粒,在这种情况下任务应该保持活着。例如。只要程序以零退出代码终止,只有当磁盘上的某个文件/目录存在时,它才会保持活动状态,只有当另一个任务也处于活动状态时,或者仅当网络当前处于运行状态时才会保持活动状态。

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

true

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

请参阅Apple的plist formatlaunchctl command line tool文档(请注意,您可以选择OS X版本,因为不同OS X版本的格式/选项会有所不同)

答案 1 :(得分:35)

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

它会给你一个shell one-liner来注册一个新的预定作业与已推荐的 launchd

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:6)

正如Mecki所指出的那样,启动将会是这样的。有一个名为Lingon的launchd的GUI界面,您可能想要签出,而不是手动编辑launchd文件:

  

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

     

[剪断...]

     

在此版本中,编辑配置文件比以往更容易   它有两种不同的模式。基本模式最常见   在非常简单的界面和专家模式下可以轻松获得设置   您可以在其中直接在文本或插入中添加所有设置   他们通过菜单。

答案 4 :(得分:3)

MAC OS有一个 Automator 工具,与Windows中的任务计划程序相同。使用Automator,您可以每天安排任务,并将任务与重复日历事件相关联,以便每天在指定时间运行脚本。参考链接to run scripts on daily basis in Mac OS

答案 5 :(得分:2)

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

答案 6 :(得分:1)

仅供参考:虽然我这样做是错过了它的siplicity,cron在OS X上已经成为过去。它是黑豹的看门狗。自虎以来它已经推出。因此,如果你正在运行Leopard cron不是一个选择。

答案 7 :(得分: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