找回密码
 立即注册
搜索
热搜: Java Python AI
查看: 921|回复: 0

【原创】MacOS操作手册-01 定时任务

[复制链接]
2 金钱 回复本帖可获得 2 金钱奖励! 每人限 1 次

1133

主题

2

回帖

2904

金钱

管理员

积分
4549
发表于 2025-1-28 11:04:28 | 显示全部楼层 |阅读模式
在 macOS 中配置定时任务可以通过 launchd 来实现,它是 macOS 和 OS X 系统的服务管理框架,可以用来启动、停止和管理系统服务,包括定时任务。此外,也可以使用传统的 cron 工具来设置定时任务。下面分别介绍这两种方法。
1 使用 launchd
launchd 通过 .plist 文件(属性列表文件)来定义和控制任务。这些文件可以放置在不同的目录中以决定它们的执行时机和范围(用户或系统级)。

1.1 创建一个定时任务


1.1.1 创建 .plist 文件

首先,你需要创建一个 .plist 文件,用于描述你的定时任务。假设我们要每分钟运行一次脚本 /Users/your_username/path_to_script.sh,你可以创建一个名为 com.yourname.script.plist 的文件,并将其放在 ~/Library/LaunchAgents/ 目录下以确保它仅对当前用户有效。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5.     <key>Label</key>
  6.     <string>com.yourname.script</string>

  7.     <key>ProgramArguments</key>
  8.     <array>
  9.         <string>/bin/bash</string>
  10.         <string>/Users/your_username/path_to_script.sh</string>
  11.     </array>

  12.     <key>StartInterval</key>
  13.     <integer>60</integer> <!-- 每60秒运行一次 -->

  14.     <key>RunAtLoad</key>
  15.     <true/>

  16.     <key>StandardOutPath</key>
  17.     <string>/tmp/mycommand.log</string>
  18.     <key>StandardErrorPath</key>
  19.     <string>/tmp/mycommand.err.log</string>
  20. </dict>
  21. </plist>
复制代码

1.1.2 加载任务

使用 launchctl 命令加载新创建的任务:
launchctl load ~/Library/LaunchAgents/com.yourname.script.plist

1.1.3 验证任务是否已加载

可以通过以下命令查看已加载的任务列表:
launchctl list | grep com.yourname.script

1.1.4 卸载任务

如果需要移除这个定时任务,可以使用如下命令卸载:
launchctl unload ~/Library/LaunchAgents/com.yourname.script.plist

1.2 .plist编辑


.plist 文件(Property List文件)是 macOS 和 iOS 系统中用于存储配置信息的一种格式。它通常用来定义和控制系统服务或应用程序的行为,包括定时任务的安排。下面是对 .plist 文件编辑的详细说明,特别是针对使用 launchd 安排定时任务的情况。

1.2.1 基础结构

一个基本的 .plist 文件包含一个根字典 ,其中键值对描述了任务的各种属性。以下是一个简单示例:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5.     <!-- 键值对 -->
  6. </dict>
  7. </plist>
复制代码


1.2.2 常用键值解释

Label
每个任务都需要一个唯一的标识符,即 Label。这个标签是你引用任务的方式。
  1. <key>Label</key>
  2. <string>com.example.mytask</string>
复制代码

ProgramArguments
指定要运行的命令及其参数。这是一个数组,第一项通常是解释器(如 /bin/bash),后面跟着脚本路径或其他命令行参数。
  1. <key>ProgramArguments</key>
  2. <array>
  3.     <string>/bin/bash</string>
  4.     <string>/path/to/script.sh</string>
  5. </array>
复制代码

StartInterval
如果你希望任务每隔一段时间重复执行一次,可以使用 StartInterval。值为秒数。
  1. <key>StartInterval</key>
  2. <integer>3600</integer> <!-- 每小时执行一次 -->
复制代码

StartCalendarInterval
如果需要按照具体时间来触发任务,比如每天凌晨1点执行,可以使用 StartCalendarInterval。它可以指定分钟、小时、日、月和星期几。
  1. <key>StartCalendarInterval</key>
  2. <dict>
  3.     <key>Hour</key>
  4.     <integer>1</integer> <!-- 凌晨1点 -->
  5.     <key>Minute</key>
  6.     <integer>0</integer>
  7. </dict>
复制代码

也可以设置多个时间点:
  1. <key>StartCalendarInterval</key>
  2. <array>
  3.     <dict>
  4.         <key>Hour</key>
  5.         <integer>1</integer>
  6.         <key>Minute</key>
  7.         <integer>0</integer>
  8.     </dict>
  9.     <dict>
  10.         <key>Hour</key>
  11.         <integer>13</integer>
  12.         <key>Minute</key>
  13.         <integer>30</integer>
  14.     </dict>
  15. </array>
复制代码

RunAtLoad
决定是否在加载时立即运行一次任务。
  1. <key>RunAtLoad</key>
  2. <true/>
复制代码

StandardOutPath & StandardErrorPath
指定标准输出和错误输出的日志文件路径。这对于调试很有帮助。
  1. <key>StandardOutPath</key>
  2. <string>/tmp/mytask.log</string>
  3. <key>StandardErrorPath</key>
  4. <string>/tmp/mytask.err.log</string>
复制代码

1.2.3 示例
为了创建一个 .plist 文件,使得任务每天凌晨1点执行一次,你需要设置 StartCalendarInterval 键值。这个键允许你定义任务应该在特定的时间(如每天、每月或每年的某个时间)启动。
以下是一个示例 .plist 文件,它配置了一个定时任务,该任务每天凌晨1点执行 /Users/your_username/path_to_script.sh 脚本:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5.     <key>Label</key>
  6.     <string>com.yourname.dailytask</string>

  7.     <key>ProgramArguments</key>
  8.     <array>
  9.         <string>/bin/bash</string>
  10.         <string>/Users/your_username/path_to_script.sh</string>
  11.     </array>

  12.     <!-- 设置每天凌晨1点执行 -->
  13.     <key>StartCalendarInterval</key>
  14.     <dict>
  15.         <key>Hour</key>
  16.         <integer>1</integer> <!-- 1代表凌晨1点 -->
  17.         <key>Minute</key>
  18.         <integer>0</integer>
  19.     </dict>

  20.     <!-- 可选:是否在加载时运行 -->
  21.     <key>RunAtLoad</key>
  22.     <false/>

  23.     <!-- 可选:标准输出和错误日志路径 -->
  24.     <key>StandardOutPath</key>
  25.     <string>/tmp/dailytask.log</string>
  26.     <key>StandardErrorPath</key>
  27.     <string>/tmp/dailytask.err.log</string>
  28. </dict>
  29. </plist>
复制代码


  • 确保你的脚本具有可执行权限。如果没有,可以通过以下命令添加:

chmod +x /Users/your_username/path_to_script.sh
  • 如果你希望在加载时立即运行一次任务,可以将

RunAtLoad 的值设为 [tr]。
  • 日志文件路径可以根据需要进行调整或删除。如果你不关心输出日志,可以省略

StandardOutPath 和 StandardErrorPath 部分。


2 使用 cron
虽然 launchd 是 macOS 推荐的方式,但你仍然可以使用 cron 来安排定时任务。

2.1 编辑用户的 crontab 文件
在终端中输入以下命令以编辑当前用户的 crontab 文件:
crontab -e

2.2 添加定时任务
添加一行表示你要执行的任务。例如,要每分钟运行一次脚本 /Users/your_username/path_to_script.sh,你可以添加如下行:
* * * * * /bin/bash /Users/your_username/path_to_script.sh >> /tmp/mycommand.log 2>&1
这里,五个星号分别代表分钟、小时、日、月、周几。上述例子表示每分钟执行一次指定的脚本,并将输出重定向到 /tmp/mycommand.log。

2.3 保存并退出编辑器
根据你使用的文本编辑器,保存更改并退出。对于 nano 编辑器,按 Ctrl+O 保存,然后按 Ctrl+X 退出。

2.4 列出当前用户的 cron 作业
要查看当前用户的所有 cron 作业,可以使用以下命令:
crontab -l

2.5 删除所有 cron 作业
如果你想删除所有的 cron 作业,可以使用以下命令:
crontab -r



更多技术文章和资料请关注公众号:




一个沉寂多年的IT猪儿虫
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|自学网

GMT+8, 2025-5-5 23:39 , Processed in 0.043814 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表