运维 Windows计划任务

Windows 计划任务避坑记:程序跑得好好的,任务一启动就坏

把一个 Python 脚本挂到 Windows 计划任务上,命令行里跑得好好的,任务一启动就失败。这类问题这些年撞了不下五次,症状不同,根因高度重合。记三个最经典的。

坑一:工作目录不对。脚本里用相对路径读配置、写日志,手动运行时工作目录是脚本所在目录,一切正常;计划任务默认工作目录是 C:\Windows\System32,相对路径全部落空。修法要么在脚本里 os.chdir 到脚本目录,要么任务里"起始于"填上目录(任务计划程序的"操作"编辑里有这一栏,很容易漏)。

坑二:账户差异。任务默认以当前用户跑,但勾了"不管用户是否登录都要运行"之后走的是批处理会话——没有桌面、没有映射的网络盘、某些 API 行为不同。需要访问网络资源时,注意凭据上下文;需要交互的程序直接跑不了。我们的习惯是跑服务类脚本统一用 pythonw.exe + SYSTEM 或专用账户,输出全部落文件,不依赖控制台。

坑三:上次结果 0x41301。任务状态显示"正在运行"但程序早退出了。多半是程序启动了子进程没退出,或者卡在交互式输入上(比如脚本里有 input)。排查方法:任务历史里看启动时间,任务管理器里找 python 进程,确认它到底活着没活着。

排查过程实录
排查过程实录

三个通用的防御习惯:脚本开头把工作目录钉死到自身位置;所有输出走绝对路径日志;任务里加"任务失败时"的操作(发通知或跑补救脚本)。挂好之后再看任务历史里的"上次运行结果",0x0 才算真的上线了。

Windows 计划任务长得像 cron,但它的会话模型和权限模型复杂得多。把这三处坑记熟,90% 的"手动正常任务失败"都能十分钟内解决。