100

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

4

7 回答 7

155

只需使用launchd。它是一个非常强大的启动器系统,同时它是 Mac OS X 的标准启动器系统(当前的 OS X 版本没有它甚至无法启动)。对于那些不熟悉launchd(或不熟悉 OS X)的人来说,它就像init, cron, at, SysVinit ( init.d) inetd,upstartsystemd. 借用所有这些项目的概念,同时提供您在其他地方可能找不到的东西。

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

系统任务转到

/Library/LaunchDaemons/

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

如果他们只在任何用户登录时运行,他们去

/Library/LaunchAgents/

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

如果它们仅在登录时运行,它们会转到

~/Library/LaunchAgents/

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

请注意,也存在/System/Library/LaunchDaemonsand /System/Library/LaunchAgents,但像往常一样,下面的所有内容/System都由 OS X 管理。您不应将任何文件放在那里,也不应更改任何文件,除非您真的知道自己在做什么。在 Systems 文件夹中乱搞可能会使您的系统无法使用(使其进入甚至拒绝再次启动的状态)。这些是 Apple 放置launchd在引导期间启动和运行系统、根据需要自动启动服务、执行系统维护任务等任务的目录。

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

com.example.my-fancy-task.plist

这个 plist 可以有各种选项和设置。单手书写不适合初学者,因此您可能需要像LaunchControl(免费)或Lingon(商业,14.99 美元)这样的工具来创建您的任务。

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

<?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。您还可以在某些日期/时间运行任务(基本上,launchd 可以做 cron 可以做的所有事情),或者您甚至可以禁用“OnDemand”导致launchd 保持进程永久运行(如果它退出或崩溃,launchd 将立即重新启动它) . 您甚至可以限制一个进程可以使用多少资源。

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

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

launchctl <command> <parameter>

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

更新: 尽管load, unload, start, and stopdo 仍然有效,但它们现在已成为传统。新命令是bootstrapbootoutenabledisable,语法和选项略有不同。一个很大的区别是它disable是持久的,所以一旦服务被禁用,它将保持禁用状态,即使在重新启动后,直到您再次启用它。您也可以使用kickstart它来立即运行任务,而不管它是如何被配置为运行的。

新旧命令之间的主要区别在于它们按“域”分隔任务。系统有域,每个用户也有。因此,同样标记的任务可能存在于不同的域中,并且launctl仍然可以区分它们。甚至同一用户的不同登录和不同 UI 会话也有自己的域(例如,同一用户可能曾经在本地登录,一次通过 SSH 远程登录,并且可能为任一会话运行不同的任务),每个正在运行的进程也是如此。因此com.example.my-fancy-task,您现在将使用system/com.example.my-fancy-taskoruser/501/com.example.my-fancy-task来标识任务,而不是 ,其中 501 是特定用户的用户 ID。

请参阅plist 格式launchctl命令行工具的文档。

于 2008-09-25T13:43:27.990 回答
60

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

它会给你一个 shell 单行程序来注册一个新的预定作业与已经推荐的launchd

于 2013-10-25T11:50:39.773 回答
14

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

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

于 2008-09-25T12:30:48.790 回答
9

您可以使用 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

于 2019-10-24T14:01:22.800 回答
8

正如 Mecki 指出的那样,launchd 将是解决这个问题的方法。launchd 有一个名为Lingon的 GUI 界面,您可能想查看它,而不是手动编辑 launchd 文件:

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

[剪断...]

在这个版本中编辑配置文件比以往任何时候都容易,它有两种不同的模式。基本模式在非常简单的界面中提供最常用的设置,而专家模式则可以直接在文本中添加所有设置或通过菜单插入它们。

于 2008-09-25T16:10:45.047 回答
4

MAC OS 有一个Automator Tool,它与windows中的Task Scheduler相同。使用 Automator,您可以每天安排任务,并将任务与重复的日历事件链接,以便在每天指定的时间运行脚本。参考链接以在 Mac OS 中每天运行脚本

于 2016-06-10T05:35:40.290 回答
2

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

于 2008-09-25T14:31:47.250 回答