name: create-system-routine description: 创建基于时间的系统例程(cron/launchd)用于脚本或命令。用于操作系统级调度,非用于Jazz工作流。
创建系统例程
何时使用此技能
当用户希望在操作系统级别创建或管理基于时间的例程(计划任务)时使用此技能(例如,运行Shell脚本、二进制文件或特定命令)。
- Linux → 使用
cron(crontab -e,系统/用户crontab) - macOS → 使用
launchd(带有plist文件的LaunchAgents / LaunchDaemons) - Windows → 此技能不应创建例程;相反,解释Windows任务计划程序需要手动配置。
工作流程
-
检测操作系统
使用标准Shell命令检测操作系统:
uname_s=$(uname -s 2>/dev/null || echo unknown) case "$uname_s" in Linux) os=linux ;; Darwin) os=macos ;; MINGW*|MSYS*|CYGWIN*|Windows_NT) os=windows ;; *) os=unknown ;; esac- 如果
os=linux→ 遵循 Linux / cron 工作流程。 - 如果
os=macos→ 遵循 macOS / launchd 工作流程。 - 如果
os=windows或os=unknown→ 解释此技能不支持在此操作系统上创建例程,并建议使用Windows任务计划程序或其他平台特定机制。
- 如果
-
从用户收集例程参数(如需,进行问卷调查)
在获得足够信息之前,不要创建cron条目或plist。 如果用户的请求模糊(例如“计划某事”、“每天运行脚本”)或缺少以下任何项,引导他们通过简短问卷而不是猜测。
当你知道以下信息时,拥有足够信息:
- 要运行的命令或脚本(首选绝对路径)。如果只有相对路径或“一个脚本”,请求完整路径或帮助他们解析。
- 计划:何时运行?
- 对于Linux:cron表达式(例如
0 8 * * *) - 对于macOS:
StartCalendarInterval的时间组件(例如 Hour=8, Minute=0)
- 对于Linux:cron表达式(例如
- 机器在计划时间关闭或休眠时的行为:解释cron和launchd都不会在机器关闭时运行;如果他们希望追赶,提供“在计划时间和启动/登录时运行”。
如何运行问卷:
- 一次问一个或几个问题;不要一次性列出长列表。
- 如果他们说“每天”或“每小时”,转换为cron/launchd并确认。
- 一旦获得命令/脚本和计划(以及可选的追赶行为),继续创建例程。
-
Linux / cron 工作流程(
os=linux)-
验证工具:
检查
crontab的可用性:command -v crontab >/dev/null 2>&1如果缺少,解释cron不可用,建议使用
systemd定时器或其他调度器;此技能不直接配置这些。 -
准备cron条目:
构建一个cron行,如:
"<CRON_SCHEDULE> <COMMAND> # created-by-jazz-create-routines"对命令和任何脚本使用绝对路径。如果需要环境变量,推荐将逻辑包装在Shell脚本中并从cron调用该脚本。
-
安装cron条目(用户crontab):
安全地将新条目追加到用户的crontab:
tmp_cron=$(mktemp) crontab -l 2>/dev/null >"$tmp_cron" || true printf '%s
-
’ “<CRON_LINE>” >>“$tmp_cron” crontab “$tmp_cron” rm -f “$tmp_cron” ```
- 保留现有的cron条目。
- 用注释标记条目以便后续识别/移除。
-
(可选)启动或登录追赶:
对于“在早上8点或下次启动时运行”语义,指导用户:
- 创建一个小脚本记录最后运行时间戳,仅在给定时间后每天运行一次。
- 添加两个基于时间的cron(例如
0 8 * * *)和一个@rebootcron条目来调用同一个脚本。
-
macOS / launchd 工作流程(
os=macos)-
选择目标:LaunchAgent 对比 LaunchDaemon:
- 对于用户级例程,首选 LaunchAgent:
- 位置:
~/Library/LaunchAgents - 在登录用户的上下文中运行。
- 位置:
- 仅对系统范围服务使用LaunchDaemon(不适用于个人例程)。
- 对于用户级例程,首选 LaunchAgent:
-
创建LaunchAgents目录(如需):
确保
~/Library/LaunchAgents在写入plist文件前存在。 -
定义唯一标签:
使用反向DNS样式标签,例如
com.jazz.create-routines.<name>。 -
写入plist文件
在以下位置创建plist:
~/Library/LaunchAgents/com.jazz.create-routines.<name>.plist示例模板:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.jazz.create-routines.<name></string> <key>ProgramArguments</key> <array> <string>/bin/zsh</string> <string>-lc</string> <string>/absolute/path/to/script.sh</string> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>8</integer> <key>Minute</key> <integer>0</integer> </dict> <!-- 可选:在代理加载时运行(例如登录时) --> <key>RunAtLoad</key> <true/> </dict> </plist>注意事项:
- 使用绝对路径。
- 如果需要环境变量或PATH修改,在脚本内进行。
-
加载(或重新加载)LaunchAgent
launchctl unload ~/Library/LaunchAgents/com.jazz.create-routines.<name>.plist 2>/dev/null || true launchctl load ~/Library/LaunchAgents/com.jazz.create-routines.<name>.plist -
解释关闭/休眠行为
澄清:
- 如果Mac在计划时间关闭或完全休眠,launchd不会在那个时刻运行任务。
- 对于“在早上8点或下次登录时运行”行为,结合
StartCalendarInterval与RunAtLoad并在脚本中实现一个小防护,仅在某个时间后每天运行一次。
-
-
Windows / 不支持的工作流程(
os=windows或os=unknown)- 不要尝试创建或修改任务。
- 用清晰的指导回应:
- 解释此技能不管理Windows任务计划程序。
- 建议用户手动在任务计划程序中配置任务或使用其他工具。
-
移除/更新例程
当用户想要移除或更新此技能创建的例程时:
-
Linux (cron):
- 读取当前crontab:
crontab -l。 - 过滤或编辑带有
# created-by-jazz-create-routines的行。 - 写回修改后的crontab。
- 读取当前crontab:
-
macOS (launchd):
- 通过
launchctl unload卸载LaunchAgent。 - 编辑或移除
~/Library/LaunchAgents下的相应plist文件。
- 通过
始终解释将更改什么,并在可能的情况下进行备份(例如将旧crontab复制到临时文件)再进行破坏性编辑。
-