
如何用 cron、launchd 或 Windows 任务计划程序定时无人值守运行 career-ops 的 node scan.mjs【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-opscareer-ops 的scan.mjs是一个零 token 的职位门户扫描器它读取portals.yml里配置的目标公司调用公开 ATS API 或本地 parser 拉取职位把新条目追加到data/pipeline.md全程不消耗 LLM token并且是幂等的——已见过的 URL 会被去重跳过见 docs/AUTOMATION.md 和 docs/SCRIPTS.md。这意味着它可以安全地交给操作系统的调度器无人值守运行macOS / Linux 用 cron 或 launchdWindows 用任务计划程序Task Scheduler。这篇文章对应 docs/AUTOMATION.md 的 Schedule the scan 一节按你所在的平台配置一个定时任务让node scan.mjs周期性自动跑跑完后新职位自动落到data/pipeline.md的## Pending区域。前提先手动跑通一次扫描定时任务只是把命令交给调度器执行调度器本身不会帮你装依赖或配置目标公司。按 docs/SETUP.md 的要求机器上需要Node.js 18 和gitnpx随 Node 自带career-ops 已安装例如一条命令npx santifer/career-ops init克隆到./career-ops并装好依赖或手动git clone后npm install完成首次运行引导career-ops 会在聊天中收集你的 CV、目标职位等信息并帮你配好portals.yml里的扫描目标。portals.yml存在且可解析是扫描能跑起来的前提——scan.mjs的退出码约定是0表示扫描完成1表示配置错误或找不到portals.yml见 docs/SCRIPTS.md。先手动跑一次确认没问题cd /path/to/career-ops node scan.mjs输出匹配职位、data/pipeline.md出现新条目就可以进入定时配置。所有平台通用的两个细节无论选哪种调度器docs/AUTOMATION.md 强调两点把示例里的/path/to/career-ops换成你的实际检出目录。后文所有命令块中的这个占位符都是这个意思。确认node在调度器使用的 PATH 上。调度器通常以极简环境启动 shell交互式终端里能用的node在 cron/launchd/Task Scheduler 里可能不存在。拿不准就用绝对路径例如先which node查出路径再用类似/usr/local/bin/node的写法。Windows 上还有一个额外陷阱任务计划程序没有控制台stdout 和 stderr 会被直接丢弃。一次失败的任务和一次挂死的任务在磁盘上看起来一模一样除非命令把输出重定向到文件见 docs/WINDOWS.md 第 7 节。macOS / Linux — cron用crontab -e打开 crontab添加一行。下面是 docs/AUTOMATION.md 给出的示例把/path/to/career-ops换成你的检出目录/usr/local/bin/node换成which node查出的绝对路径0 9 */3 * * cd /path/to/career-ops /usr/local/bin/node scan.mjs data/scan.log 21这一行的排程含义要留意它表示每月 1、4、7……31 日的上午 9 点运行即日字段每 3 天。*/3在每个月的月初会重新计数所以跨月时段的间隔可能是 1–3 天而不是严格的滚动 72 小时。文档给出的更简单替代是每天跑一次让扫描器自身的去重吸收不需要扫描的日子——反正重复 URL 会被跳过0 9 * * * cd /path/to/career-ops /usr/local/bin/node scan.mjs data/scan.log 21或只在工作日早上 8 点跑0 8 * * 1-5 cd /path/to/career-ops /usr/local/bin/node scan.mjs data/scan.log 21三种写法都通过 data/scan.log 21把输出追加到data/scan.log这是 cron 下唯一能事后排查运行情况的痕迹。macOS — launchd比 cron 更能扛睡眠笔记本经常合盖时launchd 比 cron 更合适launchd会在机器唤醒后立即补跑一次错过的日历排程扫描器的去重让多跑一次无害。把下面内容保存为~/Library/LaunchAgents/io.career-ops.scan.plist替换其中的/path/to/career-ops和 node 路径然后执行launchctl load ~/Library/LaunchAgents/io.career-ops.scan.plist?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringio.career-ops.scan/string keyProgramArguments/key array string/usr/local/bin/node/string stringscan.mjs/string /array keyWorkingDirectory/key string/path/to/career-ops/string keyStartCalendarInterval/key dict keyHour/key integer9/integer keyMinute/key integer0/integer /dict keyStandardOutPath/key string/path/to/career-ops/data/scan.log/string keyStandardErrorPath/key string/path/to/career-ops/data/scan.log/string /dict /plist这个示例用的是日历排程StartCalendarInterval每天 9 点。如果你要的是与挂钟无关的每 72 小时真实间隔可选分支把StartCalendarInterval整块换成按秒计的StartIntervalkeyStartInterval/key integer259200/integerStandardOutPath/StandardErrorPath指向data/scan.log等价于 cron 里的 data/scan.log 21。Windows — Task Scheduler在 PowerShell 里注册每日任务把C:\path\to\career-ops换成你的检出目录docs/AUTOMATION.md 原样给出的片段$action New-ScheduledTaskAction -Execute node.exe -Argument scan.mjs -WorkingDirectory C:\path\to\career-ops $trigger New-ScheduledTaskTrigger -Daily -At 9am Register-ScheduledTask -TaskName career-ops scan -Action $action -Trigger $trigger -Description Recurring career-ops scandocs/WINDOWS.md 第 7 节针对 Windows 调度补充了三条容易踩的坑输出默认被丢弃。上面的示例没有重定向建议让命令自己落日志如给 Action 的 Argument 加上重定向写法让输出进data\scan.log否则失败无迹可查PowerShell 动作里加-NonInteractive任何交互式提示都会让任务挂到执行时限如果任务被注册为 Run with highest privileges只能在提升权限的 shell 里用Set-ScheduledTask编辑它否则报Access is denied。另外注意 Windows 的路径写法Node 脚本接受D:\jobs\posting.md和D:/jobs/posting.md两种绝对路径/d/...是 Git Bash 挂载形式在任务计划程序里不成立。验证定时运行是否生效配置完调度器后等下一个触发点或手动触发一次按以下顺序检查这些文件都由扫描器自己写入data/pipeline.md每次运行后新职位条目会追加到## Pending小节每行格式为- [ ] url | company | title | location | comp | posted: date | note: text标题之后的列是可选的。已有条目不重复出现是去重在工作的表现。data/scan-runs.tsv每次非 dry-run 扫描结束后scan.mjs向该文件追加一行统计记录本次检查了多少公司/门户、找到/过滤/去重/新增了多少职位、发生多少错误见 docs/SCRIPTS.md。定时任务跑没跑、扫到什么规模看这个文件最直接。data/scan.logcron/launchd/重定向后的 Windows 场景命令的 stdout/stderr 都在这里。如果scan-runs.tsv一直没有新行而日志里反复出现配置类错误方向就是portals.yml——退出码1的语义就是配置错误或找不到portals.yml。限制与边界定时扫描只负责免费收集它读公开职位 API把 URL 追加进管道不评估职位、不消耗 token。真正花 token 的评估/career-ops pipeline是之后你手动决定对哪些条目执行的步骤。文档建议的完整无人值守链路是定时扫描 零 token 分诊docs/AUTOMATION.md 第 2 节给出一段只读config/profile.yml和data/pipeline.md、按标题地点写data/shortlist.md的分诊 prompt可粘贴给你的 CLI agent也可接在定时扫描之后。如果配置了并行扫描通道CAREER_OPS_PORTALS/CAREER_OPS_PIPELINE/CAREER_OPS_SCAN_HISTORY等环境变量记得给每条通道独立的CAREER_OPS_SCAN_HISTORY否则两个通道会共用去重源、互相静默压制见 docs/SCRIPTS.md。单通道配置不需要关心这点。定时任务失败时Windows 任务计划程序默认不留任何日志务必按上文做重定向cron/launchd 则依赖data/scan.log。【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考