我构建了一个应用程序,用于在几个不同的数据库之间复制数据。此应用程序当前每天上午 5:00 通过 Windows Server 2019 VM 上的计划任务运行。无论用户是否登录,该任务都设置为在管理用户帐户下以提升的权限运行。大多数日子里,它似乎运行良好,我收到了通知电子邮件,告知我任务已按预期成功(或可能失败)完成。
然而,一些早上我发现我没有收到通知消息。我查看任务计划程序运行我的应用程序的任务的历史记录,我看到它指出执行已终止,因为它已达到我的 8 小时“超时”(如果成功,任务通常只需不到 10 分钟即可完成)。
为了找出问题所在并进行故障排除,我向应用程序添加了大量详细日志记录。在出现故障时,应用程序正在启动一个新cmd.exe
进程来运行pg_dump
。但事情开始变得有点奇怪。
成功完成任务后,将生成类似如下的日志(已编辑):
[05:01:11] [ INFO ] Microsoft Windows [Version 10.0.17763.3165]
[05:01:11] [ INFO ] (c) 2018 Microsoft Corporation. All rights reserved.
[05:01:11] [ INFO ]
[05:01:11] [ INFO ] C:\Windows\system32>CLS
[05:01:11] [ INFO ]
[05:01:11] [ INFO ] C:\Windows\system32>SET PGPASSWORD=<DBPASSWORD>
[05:01:11] [ INFO ]
[05:01:11] [ INFO ] C:\Windows\system32>PUSHD "\\<PGSQLHOST>\C$\PGSQL\bin"
[05:01:11] [ INFO ]
[05:01:11] [ INFO ] Y:\PGSQL\bin>SET BinPath=%cd%
[05:01:11] [ INFO ]
[05:01:11] [ INFO ] Y:\PGSQL\bin>%BinPath%\pg_dump.exe -h <PGSQLHOST> -U <DBUSER> -p 5432 -E UTF8 -v -f "\\<ARCHIVESERVER>\Archives\SchemaName.pgdmp" --schema \"SchemaName\" <DBNAME>
[05:01:17] [ WARN ] pg_dump: <A BUNCH OF LINES DETAILING WHAT pg_dump IS DOING>
[05:01:17] [ INFO ]
[05:01:17] [ INFO ] Y:\PGSQL\bin>POPD
[05:01:17] [ INFO ]
[05:01:17] [ INFO ] C:\Windows\System32>EXIT
但是,当我在进程超时的那一天检查日志时,这是字面上地我所看到的(不是已编辑):
[05:01:08] [ INFO ] Microsoft Windows [Version 10.0.17763.3165]
[05:01:08] [ INFO ] (c) 2018 Microsoft Corporation. All rights reserved.
[05:01:08] [ INFO ]
甚至连第一个CLS
命令都没有执行(是的,我意识到它有点“多余”,因为它是从计划任务中运行的)。在我看来,这表明cmd.exe
一旦被调用,它就会因为某种原因而“挂起”。我试着在事件查看器失败的那一天,但没有出现与应用程序相关的事件,日志指示的时间出现的事件也很少 -应用事件日志中有几个成功的审计消息安全事件日志,我没有看到与该时间范围内的可执行文件或计划任务相关的其他内容。
我在手动运行可执行文件时从未遇到过此问题(独立于任务计划程序),但无论计划任务是否按照其常规时间表自动启动,或者我自己从计划任务内部启动,这种情况都会间歇性地发生。任务计划程序。
尽管如此,正如我上面所说,它并不总是发生。如果确实发生,这显然会更容易诊断。我尝试调整计划时间,以确保没有其他任务或流程应该干扰它,但据我所知,这似乎没有任何影响。
我是否还忽略了其他地方,在那里我可以找到这里实际发生的事情的证据?
笔记:因为这是我自己开发的一个内部应用程序,我考虑过在 StackOverflow 上发布这个问题,但觉得这个网站更合适,因为代码显然“有效”。但是,如果提供一些应用程序的代码有助于诊断,请告诉我。作为参考,该应用程序是一个用 VB.NET 编写的命令行应用程序。
答案1
Windows 中使用任务计划程序运行的进程的默认优先级低于正常值 (7)。
Task Priority Priority Category
0 Real-time
1 High
2-3 Above Normal
4-6 Normal
7-8 Below Normal
9-10 Idle
如果任务启动时服务器已经面临内存压力,则该进程将难以获取执行资源。
不幸的是,无法在任务计划程序 GUI 中更改任务优先级。以下是更改任务优先级的相对简单的方法之一。右键单击任务计划程序中的任务,然后将任务导出为 XML 文件。
将 XML 文件中名为 priority 的元素修改为所需的任务优先级。例如,您可以将 priority 设置为 5 以设置普通优先级。
从任务计划程序中删除原始任务
从右键单击菜单或操作侧栏中选择导入任务选项来重新导入任务。
致谢:https://aavtech.site/2018/01/windows-task-scheduler-changing-task-priority/和https://community.spiceworks.com/topic/2309981-inconsistent-behavior-from-simple-one-line-script-run-from-task-scheduler