[{"data":1,"prerenderedAt":1299},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fcron-scheduling":3},{"doc":4,"prev":1266,"next":1268,"resolvedType":8,"readingMinutes":114,"audience":1275,"checklist":1279,"related":1283},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fcron-scheduling","Cron 定时任务","Cron 表达式语法、常用示例、systemd timer 与 Node.js 定时任务","article",null,"infra-deployment","服务器与部署","2026-02-27","i-carbon-cloud",{"type":15,"value":16,"toc":1242},"minimark",[17,21,25,29,58,61,65,76,79,350,354,429,433,576,579,590,621,624,627,645,648,652,655,705,768,800,804,807,823,971,975,1062,1065,1111,1114,1118,1121,1135,1139,1142,1156,1159,1162,1176,1179,1190,1193,1213,1216,1238],[18,19,6],"h1",{"id":20},"cron-定时任务",[22,23,24],"p",{},"这页适合作为“定时执行任务的速查与选型入口”。定时任务真正容易出问题的地方，往往不是表达式本身，而是时区、幂等性、日志、重试和任务重叠执行没有处理好。",[26,27,28],"h2",{"id":28},"先选执行方式",[30,31,32,40,46,52],"ul",{},[33,34,35,39],"li",{},[36,37,38],"strong",{},"系统级脚本和运维任务","：优先 Linux Cron 或 systemd timer",[33,41,42,45],{},[36,43,44],{},"服务内轻量定时逻辑","：可用应用层调度器",[33,47,48,51],{},[36,49,50],{},"云平台边缘任务","：用平台自带的 scheduled trigger",[33,53,54,57],{},[36,55,56],{},"需要更强可观察性和状态管理","：优先选择带日志和失败重试机制的方案",[22,59,60],{},"如果任务很关键，不建议只看“能不能定时触发”，还要看失败后谁来发现、谁来补救。",[26,62,64],{"id":63},"cron-表达式","Cron 表达式",[66,67,72],"pre",{"className":68,"code":70,"language":71},[69],"language-text","┌──────── 分钟 (0-59)\n│ ┌────── 小时 (0-23)\n│ │ ┌──── 日 (1-31)\n│ │ │ ┌── 月 (1-12)\n│ │ │ │ ┌ 星期 (0-7, 0和7都是周日)\n│ │ │ │ │\n* * * * *\n","text",[73,74,70],"code",{"__ignoreMap":75},"",[26,77,78],{"id":78},"常用示例",[66,80,84],{"className":81,"code":82,"language":83,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","# 每分钟\n* * * * *\n\n# 每 5 分钟\n*\u002F5 * * * *\n\n# 每小时整点\n0 * * * *\n\n# 每天凌晨 3 点\n0 3 * * *\n\n# 每天 9:30\n30 9 * * *\n\n# 每周一 8:00\n0 8 * * 1\n\n# 每月 1 号 0:00\n0 0 1 * *\n\n# 工作日每天 9:00\n0 9 * * 1-5\n\n# 每 6 小时\n0 *\u002F6 * * *\n\n# 每天 8:00 和 20:00\n0 8,20 * * *\n","bash",[73,85,86,95,112,119,125,142,147,153,169,174,180,194,199,205,220,225,231,246,251,257,272,277,283,298,303,309,325,330,336],{"__ignoreMap":75},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,94],{"class":93},"sJ8bj","# 每分钟\n",[87,96,98,102,105,107,109],{"class":89,"line":97},2,[87,99,101],{"class":100},"szBVR","*",[87,103,104],{"class":100}," *",[87,106,104],{"class":100},[87,108,104],{"class":100},[87,110,111],{"class":100}," *\n",[87,113,115],{"class":89,"line":114},3,[87,116,118],{"emptyLinePlaceholder":117},true,"\n",[87,120,122],{"class":89,"line":121},4,[87,123,124],{"class":93},"# 每 5 分钟\n",[87,126,128,130,134,136,138,140],{"class":89,"line":127},5,[87,129,101],{"class":100},[87,131,133],{"class":132},"sVt8B","\u002F5 ",[87,135,101],{"class":100},[87,137,104],{"class":100},[87,139,104],{"class":100},[87,141,111],{"class":100},[87,143,145],{"class":89,"line":144},6,[87,146,118],{"emptyLinePlaceholder":117},[87,148,150],{"class":89,"line":149},7,[87,151,152],{"class":93},"# 每小时整点\n",[87,154,156,160,163,165,167],{"class":89,"line":155},8,[87,157,159],{"class":158},"sScJk","0",[87,161,104],{"class":162},"sj4cs",[87,164,104],{"class":162},[87,166,104],{"class":162},[87,168,111],{"class":162},[87,170,172],{"class":89,"line":171},9,[87,173,118],{"emptyLinePlaceholder":117},[87,175,177],{"class":89,"line":176},10,[87,178,179],{"class":93},"# 每天凌晨 3 点\n",[87,181,183,185,188,190,192],{"class":89,"line":182},11,[87,184,159],{"class":158},[87,186,187],{"class":162}," 3",[87,189,104],{"class":162},[87,191,104],{"class":162},[87,193,111],{"class":162},[87,195,197],{"class":89,"line":196},12,[87,198,118],{"emptyLinePlaceholder":117},[87,200,202],{"class":89,"line":201},13,[87,203,204],{"class":93},"# 每天 9:30\n",[87,206,208,211,214,216,218],{"class":89,"line":207},14,[87,209,210],{"class":158},"30",[87,212,213],{"class":162}," 9",[87,215,104],{"class":162},[87,217,104],{"class":162},[87,219,111],{"class":162},[87,221,223],{"class":89,"line":222},15,[87,224,118],{"emptyLinePlaceholder":117},[87,226,228],{"class":89,"line":227},16,[87,229,230],{"class":93},"# 每周一 8:00\n",[87,232,234,236,239,241,243],{"class":89,"line":233},17,[87,235,159],{"class":158},[87,237,238],{"class":162}," 8",[87,240,104],{"class":162},[87,242,104],{"class":162},[87,244,245],{"class":162}," 1\n",[87,247,249],{"class":89,"line":248},18,[87,250,118],{"emptyLinePlaceholder":117},[87,252,254],{"class":89,"line":253},19,[87,255,256],{"class":93},"# 每月 1 号 0:00\n",[87,258,260,262,265,268,270],{"class":89,"line":259},20,[87,261,159],{"class":158},[87,263,264],{"class":162}," 0",[87,266,267],{"class":162}," 1",[87,269,104],{"class":162},[87,271,111],{"class":162},[87,273,275],{"class":89,"line":274},21,[87,276,118],{"emptyLinePlaceholder":117},[87,278,280],{"class":89,"line":279},22,[87,281,282],{"class":93},"# 工作日每天 9:00\n",[87,284,286,288,290,292,294],{"class":89,"line":285},23,[87,287,159],{"class":158},[87,289,213],{"class":162},[87,291,104],{"class":162},[87,293,104],{"class":162},[87,295,297],{"class":296},"sZZnC"," 1-5\n",[87,299,301],{"class":89,"line":300},24,[87,302,118],{"emptyLinePlaceholder":117},[87,304,306],{"class":89,"line":305},25,[87,307,308],{"class":93},"# 每 6 小时\n",[87,310,312,314,316,319,321,323],{"class":89,"line":311},26,[87,313,159],{"class":158},[87,315,104],{"class":162},[87,317,318],{"class":296},"\u002F6",[87,320,104],{"class":162},[87,322,104],{"class":162},[87,324,111],{"class":162},[87,326,328],{"class":89,"line":327},27,[87,329,118],{"emptyLinePlaceholder":117},[87,331,333],{"class":89,"line":332},28,[87,334,335],{"class":93},"# 每天 8:00 和 20:00\n",[87,337,339,341,344,346,348],{"class":89,"line":338},29,[87,340,159],{"class":158},[87,342,343],{"class":296}," 8,20",[87,345,104],{"class":162},[87,347,104],{"class":162},[87,349,111],{"class":162},[26,351,353],{"id":352},"linux-cron","Linux Cron",[66,355,357],{"className":81,"code":356,"language":83,"meta":75,"style":75},"# 编辑当前用户的 crontab\ncrontab -e\n\n# 查看\ncrontab -l\n\n# 删除所有\ncrontab -r\n\n# 编辑其他用户的\nsudo crontab -u www-data -e\n",[73,358,359,364,372,376,381,388,392,397,404,408,413],{"__ignoreMap":75},[87,360,361],{"class":89,"line":90},[87,362,363],{"class":93},"# 编辑当前用户的 crontab\n",[87,365,366,369],{"class":89,"line":97},[87,367,368],{"class":158},"crontab",[87,370,371],{"class":162}," -e\n",[87,373,374],{"class":89,"line":114},[87,375,118],{"emptyLinePlaceholder":117},[87,377,378],{"class":89,"line":121},[87,379,380],{"class":93},"# 查看\n",[87,382,383,385],{"class":89,"line":127},[87,384,368],{"class":158},[87,386,387],{"class":162}," -l\n",[87,389,390],{"class":89,"line":144},[87,391,118],{"emptyLinePlaceholder":117},[87,393,394],{"class":89,"line":149},[87,395,396],{"class":93},"# 删除所有\n",[87,398,399,401],{"class":89,"line":155},[87,400,368],{"class":158},[87,402,403],{"class":162}," -r\n",[87,405,406],{"class":89,"line":171},[87,407,118],{"emptyLinePlaceholder":117},[87,409,410],{"class":89,"line":176},[87,411,412],{"class":93},"# 编辑其他用户的\n",[87,414,415,418,421,424,427],{"class":89,"line":182},[87,416,417],{"class":158},"sudo",[87,419,420],{"class":296}," crontab",[87,422,423],{"class":162}," -u",[87,425,426],{"class":296}," www-data",[87,428,371],{"class":162},[430,431,432],"h3",{"id":432},"示例",[66,434,436],{"className":81,"code":435,"language":83,"meta":75,"style":75},"# 每天 3 点备份数据库\n0 3 * * * \u002Fopt\u002Fscripts\u002Fbackup-db.sh >> \u002Fvar\u002Flog\u002Fbackup.log 2>&1\n\n# 每小时清理临时文件\n0 * * * * find \u002Ftmp -mtime +1 -delete\n\n# 每 5 分钟检查服务状态\n*\u002F5 * * * * \u002Fopt\u002Fscripts\u002Fhealth-check.sh\n\n# 每周日 2 点更新系统\n0 2 * * 0 apt update && apt upgrade -y >> \u002Fvar\u002Flog\u002Fapt-upgrade.log 2>&1\n",[73,437,438,443,467,471,476,503,507,512,529,533,538],{"__ignoreMap":75},[87,439,440],{"class":89,"line":90},[87,441,442],{"class":93},"# 每天 3 点备份数据库\n",[87,444,445,447,449,451,453,455,458,461,464],{"class":89,"line":97},[87,446,159],{"class":158},[87,448,187],{"class":162},[87,450,104],{"class":162},[87,452,104],{"class":162},[87,454,104],{"class":162},[87,456,457],{"class":296}," \u002Fopt\u002Fscripts\u002Fbackup-db.sh",[87,459,460],{"class":100}," >>",[87,462,463],{"class":296}," \u002Fvar\u002Flog\u002Fbackup.log",[87,465,466],{"class":100}," 2>&1\n",[87,468,469],{"class":89,"line":114},[87,470,118],{"emptyLinePlaceholder":117},[87,472,473],{"class":89,"line":121},[87,474,475],{"class":93},"# 每小时清理临时文件\n",[87,477,478,480,482,484,486,488,491,494,497,500],{"class":89,"line":127},[87,479,159],{"class":158},[87,481,104],{"class":162},[87,483,104],{"class":162},[87,485,104],{"class":162},[87,487,104],{"class":162},[87,489,490],{"class":296}," find",[87,492,493],{"class":296}," \u002Ftmp",[87,495,496],{"class":162}," -mtime",[87,498,499],{"class":296}," +1",[87,501,502],{"class":162}," -delete\n",[87,504,505],{"class":89,"line":144},[87,506,118],{"emptyLinePlaceholder":117},[87,508,509],{"class":89,"line":149},[87,510,511],{"class":93},"# 每 5 分钟检查服务状态\n",[87,513,514,516,518,520,522,524,526],{"class":89,"line":155},[87,515,101],{"class":100},[87,517,133],{"class":132},[87,519,101],{"class":100},[87,521,104],{"class":100},[87,523,104],{"class":100},[87,525,104],{"class":100},[87,527,528],{"class":132}," \u002Fopt\u002Fscripts\u002Fhealth-check.sh\n",[87,530,531],{"class":89,"line":171},[87,532,118],{"emptyLinePlaceholder":117},[87,534,535],{"class":89,"line":176},[87,536,537],{"class":93},"# 每周日 2 点更新系统\n",[87,539,540,542,545,547,549,551,554,557,560,563,566,569,571,574],{"class":89,"line":182},[87,541,159],{"class":158},[87,543,544],{"class":162}," 2",[87,546,104],{"class":162},[87,548,104],{"class":162},[87,550,264],{"class":162},[87,552,553],{"class":296}," apt",[87,555,556],{"class":296}," update",[87,558,559],{"class":132}," && ",[87,561,562],{"class":158},"apt",[87,564,565],{"class":296}," upgrade",[87,567,568],{"class":162}," -y",[87,570,460],{"class":100},[87,572,573],{"class":296}," \u002Fvar\u002Flog\u002Fapt-upgrade.log",[87,575,466],{"class":100},[430,577,578],{"id":578},"注意事项",[30,580,581,584,587],{},[33,582,583],{},"使用绝对路径",[33,585,586],{},"重定向输出避免邮件通知",[33,588,589],{},"环境变量可能与交互式 shell 不同",[66,591,593],{"className":81,"code":592,"language":83,"meta":75,"style":75},"# 在 crontab 顶部设置环境变量\nPATH=\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\nSHELL=\u002Fbin\u002Fbash\n",[73,594,595,600,611],{"__ignoreMap":75},[87,596,597],{"class":89,"line":90},[87,598,599],{"class":93},"# 在 crontab 顶部设置环境变量\n",[87,601,602,605,608],{"class":89,"line":97},[87,603,604],{"class":132},"PATH",[87,606,607],{"class":100},"=",[87,609,610],{"class":296},"\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[87,612,613,616,618],{"class":89,"line":114},[87,614,615],{"class":132},"SHELL",[87,617,607],{"class":100},[87,619,620],{"class":296},"\u002Fbin\u002Fbash\n",[26,622,623],{"id":623},"推荐实践顺序",[22,625,626],{},"建议按这个顺序设计定时任务：",[628,629,630,633,636,639,642],"ol",{},[33,631,632],{},"先把任务本体改成手动执行可成功",[33,634,635],{},"再加日志输出",[33,637,638],{},"再加定时表达式",[33,640,641],{},"再补时区、失败告警和幂等保护",[33,643,644],{},"最后再考虑批量任务和并发控制",[22,646,647],{},"先保证“手动跑得稳”，再交给调度器。",[26,649,651],{"id":650},"systemd-timer","systemd Timer",[22,653,654],{},"更现代的替代方案。",[66,656,660],{"className":657,"code":658,"language":659,"meta":75,"style":75},"language-ini shiki shiki-themes github-light github-dark","# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.service\n[Unit]\nDescription=Database Backup\n\n[Service]\nType=oneshot\nExecStart=\u002Fopt\u002Fscripts\u002Fbackup-db.sh\n","ini",[73,661,662,667,672,680,684,689,697],{"__ignoreMap":75},[87,663,664],{"class":89,"line":90},[87,665,666],{"class":93},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.service\n",[87,668,669],{"class":89,"line":97},[87,670,671],{"class":158},"[Unit]\n",[87,673,674,677],{"class":89,"line":114},[87,675,676],{"class":100},"Description",[87,678,679],{"class":132},"=Database Backup\n",[87,681,682],{"class":89,"line":121},[87,683,118],{"emptyLinePlaceholder":117},[87,685,686],{"class":89,"line":127},[87,687,688],{"class":158},"[Service]\n",[87,690,691,694],{"class":89,"line":144},[87,692,693],{"class":100},"Type",[87,695,696],{"class":132},"=oneshot\n",[87,698,699,702],{"class":89,"line":149},[87,700,701],{"class":100},"ExecStart",[87,703,704],{"class":132},"=\u002Fopt\u002Fscripts\u002Fbackup-db.sh\n",[66,706,708],{"className":657,"code":707,"language":659,"meta":75,"style":75},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.timer\n[Unit]\nDescription=Daily Database Backup\n\n[Timer]\nOnCalendar=*-*-* 03:00:00\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n",[73,709,710,715,719,726,730,735,743,751,755,760],{"__ignoreMap":75},[87,711,712],{"class":89,"line":90},[87,713,714],{"class":93},"# \u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup.timer\n",[87,716,717],{"class":89,"line":97},[87,718,671],{"class":158},[87,720,721,723],{"class":89,"line":114},[87,722,676],{"class":100},[87,724,725],{"class":132},"=Daily Database Backup\n",[87,727,728],{"class":89,"line":121},[87,729,118],{"emptyLinePlaceholder":117},[87,731,732],{"class":89,"line":127},[87,733,734],{"class":158},"[Timer]\n",[87,736,737,740],{"class":89,"line":144},[87,738,739],{"class":100},"OnCalendar",[87,741,742],{"class":132},"=*-*-* 03:00:00\n",[87,744,745,748],{"class":89,"line":149},[87,746,747],{"class":100},"Persistent",[87,749,750],{"class":132},"=true\n",[87,752,753],{"class":89,"line":155},[87,754,118],{"emptyLinePlaceholder":117},[87,756,757],{"class":89,"line":171},[87,758,759],{"class":158},"[Install]\n",[87,761,762,765],{"class":89,"line":176},[87,763,764],{"class":100},"WantedBy",[87,766,767],{"class":132},"=timers.target\n",[66,769,771],{"className":81,"code":770,"language":83,"meta":75,"style":75},"systemctl enable backup.timer\nsystemctl start backup.timer\nsystemctl list-timers\n",[73,772,773,784,793],{"__ignoreMap":75},[87,774,775,778,781],{"class":89,"line":90},[87,776,777],{"class":158},"systemctl",[87,779,780],{"class":296}," enable",[87,782,783],{"class":296}," backup.timer\n",[87,785,786,788,791],{"class":89,"line":97},[87,787,777],{"class":158},[87,789,790],{"class":296}," start",[87,792,783],{"class":296},[87,794,795,797],{"class":89,"line":114},[87,796,777],{"class":158},[87,798,799],{"class":296}," list-timers\n",[26,801,803],{"id":802},"nodejs-定时任务","Node.js 定时任务",[430,805,806],{"id":806},"node-cron",[66,808,810],{"className":81,"code":809,"language":83,"meta":75,"style":75},"pnpm add node-cron\n",[73,811,812],{"__ignoreMap":75},[87,813,814,817,820],{"class":89,"line":90},[87,815,816],{"class":158},"pnpm",[87,818,819],{"class":296}," add",[87,821,822],{"class":296}," node-cron\n",[66,824,828],{"className":825,"code":826,"language":827,"meta":75,"style":75},"language-javascript shiki shiki-themes github-light github-dark","import cron from \"node-cron\";\n\n\u002F\u002F 每 5 分钟\ncron.schedule(\"*\u002F5 * * * *\", () => {\n  console.log(\"Running task...\");\n});\n\n\u002F\u002F 每天 9:00\ncron.schedule(\n  \"0 9 * * *\",\n  () => {\n    sendDailyReport();\n  },\n  {\n    timezone: \"Asia\u002FShanghai\",\n  },\n);\n","javascript",[73,829,830,847,851,856,879,895,900,904,909,918,926,935,943,948,953,963,967],{"__ignoreMap":75},[87,831,832,835,838,841,844],{"class":89,"line":90},[87,833,834],{"class":100},"import",[87,836,837],{"class":132}," cron ",[87,839,840],{"class":100},"from",[87,842,843],{"class":296}," \"node-cron\"",[87,845,846],{"class":132},";\n",[87,848,849],{"class":89,"line":97},[87,850,118],{"emptyLinePlaceholder":117},[87,852,853],{"class":89,"line":114},[87,854,855],{"class":93},"\u002F\u002F 每 5 分钟\n",[87,857,858,861,864,867,870,873,876],{"class":89,"line":121},[87,859,860],{"class":132},"cron.",[87,862,863],{"class":158},"schedule",[87,865,866],{"class":132},"(",[87,868,869],{"class":296},"\"*\u002F5 * * * *\"",[87,871,872],{"class":132},", () ",[87,874,875],{"class":100},"=>",[87,877,878],{"class":132}," {\n",[87,880,881,884,887,889,892],{"class":89,"line":127},[87,882,883],{"class":132},"  console.",[87,885,886],{"class":158},"log",[87,888,866],{"class":132},[87,890,891],{"class":296},"\"Running task...\"",[87,893,894],{"class":132},");\n",[87,896,897],{"class":89,"line":144},[87,898,899],{"class":132},"});\n",[87,901,902],{"class":89,"line":149},[87,903,118],{"emptyLinePlaceholder":117},[87,905,906],{"class":89,"line":155},[87,907,908],{"class":93},"\u002F\u002F 每天 9:00\n",[87,910,911,913,915],{"class":89,"line":171},[87,912,860],{"class":132},[87,914,863],{"class":158},[87,916,917],{"class":132},"(\n",[87,919,920,923],{"class":89,"line":176},[87,921,922],{"class":296},"  \"0 9 * * *\"",[87,924,925],{"class":132},",\n",[87,927,928,931,933],{"class":89,"line":182},[87,929,930],{"class":132},"  () ",[87,932,875],{"class":100},[87,934,878],{"class":132},[87,936,937,940],{"class":89,"line":196},[87,938,939],{"class":158},"    sendDailyReport",[87,941,942],{"class":132},"();\n",[87,944,945],{"class":89,"line":201},[87,946,947],{"class":132},"  },\n",[87,949,950],{"class":89,"line":207},[87,951,952],{"class":132},"  {\n",[87,954,955,958,961],{"class":89,"line":222},[87,956,957],{"class":132},"    timezone: ",[87,959,960],{"class":296},"\"Asia\u002FShanghai\"",[87,962,925],{"class":132},[87,964,965],{"class":89,"line":227},[87,966,947],{"class":132},[87,968,969],{"class":89,"line":233},[87,970,894],{"class":132},[430,972,974],{"id":973},"cloudflare-workers-cron-triggers","Cloudflare Workers Cron Triggers",[66,976,978],{"className":825,"code":977,"language":827,"meta":75,"style":75},"\u002F\u002F wrangler.toml\n\u002F\u002F [triggers]\n\u002F\u002F crons = [\"*\u002F5 * * * *\"]\n\nexport default {\n  async scheduled(event, env, ctx) {\n    ctx.waitUntil(doTask());\n  },\n};\n",[73,979,980,985,990,995,999,1009,1037,1053,1057],{"__ignoreMap":75},[87,981,982],{"class":89,"line":90},[87,983,984],{"class":93},"\u002F\u002F wrangler.toml\n",[87,986,987],{"class":89,"line":97},[87,988,989],{"class":93},"\u002F\u002F [triggers]\n",[87,991,992],{"class":89,"line":114},[87,993,994],{"class":93},"\u002F\u002F crons = [\"*\u002F5 * * * *\"]\n",[87,996,997],{"class":89,"line":121},[87,998,118],{"emptyLinePlaceholder":117},[87,1000,1001,1004,1007],{"class":89,"line":127},[87,1002,1003],{"class":100},"export",[87,1005,1006],{"class":100}," default",[87,1008,878],{"class":132},[87,1010,1011,1014,1017,1019,1023,1026,1029,1031,1034],{"class":89,"line":144},[87,1012,1013],{"class":100},"  async",[87,1015,1016],{"class":158}," scheduled",[87,1018,866],{"class":132},[87,1020,1022],{"class":1021},"s4XuR","event",[87,1024,1025],{"class":132},", ",[87,1027,1028],{"class":1021},"env",[87,1030,1025],{"class":132},[87,1032,1033],{"class":1021},"ctx",[87,1035,1036],{"class":132},") {\n",[87,1038,1039,1042,1045,1047,1050],{"class":89,"line":149},[87,1040,1041],{"class":132},"    ctx.",[87,1043,1044],{"class":158},"waitUntil",[87,1046,866],{"class":132},[87,1048,1049],{"class":158},"doTask",[87,1051,1052],{"class":132},"());\n",[87,1054,1055],{"class":89,"line":155},[87,1056,947],{"class":132},[87,1058,1059],{"class":89,"line":171},[87,1060,1061],{"class":132},"};\n",[26,1063,1064],{"id":1064},"在线工具",[1066,1067,1068,1081],"table",{},[1069,1070,1071],"thead",{},[1072,1073,1074,1078],"tr",{},[1075,1076,1077],"th",{},"工具",[1075,1079,1080],{},"说明",[1082,1083,1084,1099],"tbody",{},[1072,1085,1086,1096],{},[1087,1088,1089],"td",{},[1090,1091,1095],"a",{"href":1092,"rel":1093},"https:\u002F\u002Fcrontab.guru\u002F",[1094],"nofollow","crontab.guru",[1087,1097,1098],{},"Cron 表达式解释",[1072,1100,1101,1108],{},[1087,1102,1103],{},[1090,1104,1107],{"href":1105,"rel":1106},"https:\u002F\u002Fcrontab-generator.org\u002F",[1094],"crontab-generator",[1087,1109,1110],{},"可视化生成",[26,1112,1113],{"id":1113},"常见问题",[430,1115,1117],{"id":1116},"命令在终端里能跑cron-里不执行","命令在终端里能跑，Cron 里不执行",[22,1119,1120],{},"高频原因通常是：",[30,1122,1123,1126,1129,1132],{},[33,1124,1125],{},"路径写成了相对路径",[33,1127,1128],{},"环境变量不同",[33,1130,1131],{},"Shell 不同",[33,1133,1134],{},"权限不足",[430,1136,1138],{"id":1137},"任务重复执行导致数据混乱","任务重复执行，导致数据混乱",[22,1140,1141],{},"这类任务要优先补：",[30,1143,1144,1147,1150,1153],{},[33,1145,1146],{},"幂等设计",[33,1148,1149],{},"锁文件 \u002F 分布式锁",[33,1151,1152],{},"执行中保护",[33,1154,1155],{},"失败重试策略",[430,1157,1158],{"id":1158},"时间到了却没按预期触发",[22,1160,1161],{},"优先检查：",[30,1163,1164,1167,1170,1173],{},[33,1165,1166],{},"系统时区",[33,1168,1169],{},"表达式是否写错",[33,1171,1172],{},"服务是否真的启用",[33,1174,1175],{},"平台是否有触发频率限制",[26,1177,1178],{"id":1178},"风险提醒",[30,1180,1181,1184,1187],{},[33,1182,1183],{},"定时任务不要默认无日志运行",[33,1185,1186],{},"影响数据和财务的任务必须有幂等保护",[33,1188,1189],{},"批量任务先拿小范围数据试跑，再放大规模",[26,1191,1192],{"id":1192},"延伸阅读",[30,1194,1195,1201,1207],{},[33,1196,1197],{},[1090,1198,1200],{"href":1199},"\u002Fdocs\u002Fmonitoring-logging","监控与日志",[33,1202,1203],{},[1090,1204,1206],{"href":1205},"\u002Fdocs\u002Fcloudflare-workers","Cloudflare Workers 与 Pages",[33,1208,1209],{},[1090,1210,1212],{"href":1211},"\u002Fdocs\u002Fshell-scripting","Shell 脚本基础",[26,1214,1215],{"id":1215},"参考链接",[30,1217,1218,1224,1231],{},[33,1219,1220,1223],{},[1090,1221,1095],{"href":1092,"rel":1222},[1094]," — 在线解释器",[33,1225,1226,1230],{},[1090,1227,651],{"href":1228,"rel":1229},"https:\u002F\u002Fwiki.archlinux.org\u002Ftitle\u002FSystemd\u002FTimers",[1094]," — Arch Wiki",[33,1232,1233,1237],{},[1090,1234,806],{"href":1235,"rel":1236},"https:\u002F\u002Fgithub.com\u002Fnode-cron\u002Fnode-cron",[1094]," — Node.js 定时任务",[1239,1240,1241],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":75,"searchDepth":97,"depth":97,"links":1243},[1244,1245,1246,1247,1251,1252,1253,1257,1258,1263,1264,1265],{"id":28,"depth":97,"text":28},{"id":63,"depth":97,"text":64},{"id":78,"depth":97,"text":78},{"id":352,"depth":97,"text":353,"children":1248},[1249,1250],{"id":432,"depth":114,"text":432},{"id":578,"depth":114,"text":578},{"id":623,"depth":97,"text":623},{"id":650,"depth":97,"text":651},{"id":802,"depth":97,"text":803,"children":1254},[1255,1256],{"id":806,"depth":114,"text":806},{"id":973,"depth":114,"text":974},{"id":1064,"depth":97,"text":1064},{"id":1113,"depth":97,"text":1113,"children":1259},[1260,1261,1262],{"id":1116,"depth":114,"text":1117},{"id":1137,"depth":114,"text":1138},{"id":1158,"depth":114,"text":1158},{"id":1178,"depth":97,"text":1178},{"id":1192,"depth":97,"text":1192},{"id":1215,"depth":97,"text":1215},{"path":1205,"title":1206,"description":1267,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"Wrangler CLI、Workers 开发、Pages 部署、KV\u002FD1\u002FR2 存储服务使用指南",{"path":1269,"title":1270,"description":1271,"docType":8,"resourceKind":9,"categoryId":1272,"categoryLabel":1273,"updatedAt":12,"publishedAt":12,"icon":1274},"\u002Fdocs\u002Fdns-hosts","DNS 与 Hosts 配置","DNS 服务器推荐、Hosts 文件编辑、DNS 加密与常见问题排查","network-security","网络与安全","i-carbon-network-4",[1276,1277,1278],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1280,1281,1282],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1284,1289,1293,1295],{"path":1285,"title":1286,"description":1287,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1288,"publishedAt":1288,"icon":13},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","2026-02-28",{"path":1290,"title":1291,"description":1292,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1288,"publishedAt":1288,"icon":13},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成",{"path":1199,"title":1200,"description":1294,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"服务器监控工具、日志管理、Uptime 监控与告警配置",{"path":1296,"title":1297,"description":1298,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门","Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境",1776215712467]