创建系统定时任务Skill create-system-routine

这个技能用于在操作系统级别创建和管理基于时间的系统例程,例如使用cron(Linux)或launchd(macOS)调度脚本或命令的执行。适用于自动化任务、定时备份、系统监控等场景。关键词:系统定时任务、cron、launchd、调度、自动化、脚本执行、操作系统级任务计划。

DevOps 0 次安装 0 次浏览 更新于 3/15/2026

name: create-system-routine description: 创建基于时间的系统例程(cron/launchd)用于脚本或命令。用于操作系统级调度,非用于Jazz工作流。

创建系统例程

何时使用此技能

当用户希望在操作系统级别创建或管理基于时间的例程(计划任务)时使用此技能(例如,运行Shell脚本、二进制文件或特定命令)。

  • Linux → 使用 croncrontab -e,系统/用户crontab)
  • macOS → 使用 launchd(带有plist文件的LaunchAgents / LaunchDaemons)
  • Windows → 此技能不应创建例程;相反,解释Windows任务计划程序需要手动配置。

工作流程

  1. 检测操作系统

    使用标准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=windowsos=unknown → 解释此技能不支持在此操作系统上创建例程,并建议使用Windows任务计划程序或其他平台特定机制。
  2. 从用户收集例程参数(如需,进行问卷调查)

    在获得足够信息之前,不要创建cron条目或plist。 如果用户的请求模糊(例如“计划某事”、“每天运行脚本”)或缺少以下任何项,引导他们通过简短问卷而不是猜测。

    当你知道以下信息时,拥有足够信息:

    • 要运行的命令或脚本(首选绝对路径)。如果只有相对路径或“一个脚本”,请求完整路径或帮助他们解析。
    • 计划:何时运行?
      • 对于Linux:cron表达式(例如 0 8 * * *
      • 对于macOS:StartCalendarInterval 的时间组件(例如 Hour=8, Minute=0)
    • 机器在计划时间关闭或休眠时的行为:解释cron和launchd都不会在机器关闭时运行;如果他们希望追赶,提供“在计划时间和启动/登录时运行”。

    如何运行问卷:

    • 一次问一个或几个问题;不要一次性列出长列表。
    • 如果他们说“每天”或“每小时”,转换为cron/launchd并确认。
    • 一旦获得命令/脚本和计划(以及可选的追赶行为),继续创建例程。
  3. Linux / cron 工作流程os=linux

    1. 验证工具

      检查 crontab 的可用性:

      command -v crontab >/dev/null 2>&1
      

      如果缺少,解释cron不可用,建议使用 systemd 定时器或其他调度器;此技能不直接配置这些。

    2. 准备cron条目

      构建一个cron行,如:

      "<CRON_SCHEDULE> <COMMAND> # created-by-jazz-create-routines"
      

      对命令和任何脚本使用绝对路径。如果需要环境变量,推荐将逻辑包装在Shell脚本中并从cron调用该脚本。

    3. 安装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条目。
  - 用注释标记条目以便后续识别/移除。
  1. (可选)启动或登录追赶

    对于“在早上8点或下次启动时运行”语义,指导用户:

    • 创建一个小脚本记录最后运行时间戳,仅在给定时间后每天运行一次。
    • 添加两个基于时间的cron(例如 0 8 * * *)和一个 @reboot cron条目来调用同一个脚本。
  2. macOS / launchd 工作流程os=macos

    1. 选择目标:LaunchAgent 对比 LaunchDaemon

      • 对于用户级例程,首选 LaunchAgent
        • 位置: ~/Library/LaunchAgents
        • 在登录用户的上下文中运行。
      • 仅对系统范围服务使用LaunchDaemon(不适用于个人例程)。
    2. 创建LaunchAgents目录(如需)

      确保 ~/Library/LaunchAgents 在写入plist文件前存在。

    3. 定义唯一标签

      使用反向DNS样式标签,例如 com.jazz.create-routines.<name>

    4. 写入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修改,在脚本内进行。
    5. 加载(或重新加载)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
      
    6. 解释关闭/休眠行为

      澄清:

      • 如果Mac在计划时间关闭或完全休眠,launchd不会在那个时刻运行任务。
      • 对于“在早上8点或下次登录时运行”行为,结合 StartCalendarIntervalRunAtLoad 并在脚本中实现一个小防护,仅在某个时间后每天运行一次。
  3. Windows / 不支持的工作流程os=windowsos=unknown

    • 不要尝试创建或修改任务。
    • 用清晰的指导回应:
      • 解释此技能不管理Windows任务计划程序。
      • 建议用户手动在任务计划程序中配置任务或使用其他工具。
  4. 移除/更新例程

    当用户想要移除或更新此技能创建的例程时:

    • Linux (cron)

      • 读取当前crontab:crontab -l
      • 过滤或编辑带有 # created-by-jazz-create-routines 的行。
      • 写回修改后的crontab。
    • macOS (launchd)

      • 通过 launchctl unload 卸载LaunchAgent。
      • 编辑或移除 ~/Library/LaunchAgents 下的相应plist文件。

    始终解释将更改什么,并在可能的情况下进行备份(例如将旧crontab复制到临时文件)再进行破坏性编辑。