如何解决Windows计划任务无法运行的问题?

13
在部署我们的 .net 应用程序的过程中,我在服务器上设置了大约 20 个定时任务,它们基本上都做同样的事情:调用一个小的 .net 控制台应用程序从 SQL 数据库中提取数据并将其发布到 Web 服务。每个任务都调用一个应用程序的单独副本,每个副本在其配置文件中具有不同的查找 ID 值。
除了其中两个任务之外,所有任务每晚都可靠地运行。这两个任务似乎有时会断断续续地停止运行,目前还不知道原因。当它们停止运行时,计划任务界面会正确显示它们的最后运行日期,该日期比其他任务晚一天或更长时间,而其他任务则按计划时间继续运行。停止运行的任务尽管被指定为每晚运行,但不会自动重新运行。事件日志或计划任务界面本身中都没有记录错误。对我们来说最奇怪的是:如果我手动启动计划任务,它就会正常运行,调用 .net 控制台应用程序,一切都能够正常结束。然后它继续按计划时间运行良好,持续数天或数周,只是最终会突然失败。看起来这两个任务总是在同一晚开始失败。

1
我认为这个问题的答案https://dev59.com/KI_ea4cB1Zd3GeqPKCLm也可以帮助一些人,解决手动运行的任务为什么不总是按计划运行的问题。(但从它们的描述方式来看,这些并不是重复的问题。)总结:Windows 2012计划任务不总是能够看到正确的环境变量,包括PATH,对于设置为运行任务的账户;事实上,只有当任务用户实际登录时,他们才能看到完整的正确变量集。 - MikeBeaton
10个回答

11

有一个“最后结果”列,应该给出与任务本身运行相关的代码(它不会有任何异常数据)。 0表示任务完成而没有错误。其他任何情况下,您都可以查看并了解为什么任务无法启动。如果任务似乎仍未运行,但您仍然看到“最后结果”为0,则意味着您的代码中存在某些问题,但它正在正常退出。


5

你有设置“启动位置”属性吗?

如果这些.NET控制台应用程序需要app.config或一些文件位于它们的路径中,您必须将“启动位置”属性设置为“c:\ your \ app \ path \”,否则它们将以系统目录的方式启动,无法找到所需的文件!


4

在64位系统上,任务计划程序默认认为应用程序是64位的。如果它是32位的,请从32位命令行启动它,例如,如果您想运行c:\program files (x86)\Myprogram\Program.exe,则告诉任务计划程序启动:

  • %systemroot%\Syswow64\cmd.exe /C "c:\program files (x86)\Myprogram\Program.exe"

这将强制它从32位命令提示符启动,因此使用32位仿真。


2

1
下面的SO问题的答案对于阅读此问题的人也可能非常相关(但请注意,它仅描述了计划任务的一个可能特定问题,我认为这两个问题都不是重复的): 为什么我的计划任务正确更新其“上次运行时间”,并给出“(0x0)”的“上次运行结果”,但实际上仍然无法工作? 回答那个问题的摘要是Windows 2012计划任务不会看到以设置为要运行的帐户为基础的正确环境变量,包括PATH。
就更一般的计划任务故障排除而言(正如在本问题中所询问的),您可以测试此特定问题(例如,在任务中运行SET > test.txt,如该答案中建议的那样),一旦您能够看到它发生,如果它影响您,您可以解决此问题。

1
在我的情况下,尽管显示上次运行成功(0),但计划任务却无法运行。后来发现运行任务的Windows用户帐户已被锁定。我之所以意识到这一点,是因为我尝试编辑现有的计划任务,将用户帐户设置为相同的帐户,然后点击“确定”,结果出现了帐户被锁定的错误。

1

计划任务无法运行的一个原因是将其与无密码的Windows用户帐户关联:默认情况下,计划任务会防止使用空密码运行。如果您想从没有密码的帐户运行计划任务,则必须禁用系统变量:

  • 转到:开始 > 管理工具 > 本地安全策略 > 安全设置 > 本地策略 > 安全选项
  • 选择:“帐户:仅限控制台登录使用空密码的本地帐户”
  • 禁用此变量

免责声明:不建议使用没有密码的帐户。


0

也许它们挂了但仍在运行?

您可以点击附加菜单并选择菜单项以查看日志,然后记事本将打开任务计划程序的日志文件。


0

0

我在2023年2月23日发现了一个类似的问题,但我的日志显示它始于2023年1月中旬。

我的任务已经运行了很多个月而没有出现任何问题。之后我开始看到同样的错误:系统找不到指定的文件。在整整一天的测试和搜索后,我发现2023年1月10日的Windows更新更改了处理空格的方式。以前只需要一个双引号,命令行帮助解释如下:

C:\> schtasks /create /?

==> 通过使用两组引号(一组用于CMD.EXE,一组用于Schtasks.exe),可以使用文件路径中的空格。 CMD的外部引号需要是双引号;内部引号可以是单引号或转义双引号:

SCHTASKS /Create

/tr “'c: \\ program files \\ internet explorer \\ iexplorer.exe' ‘c: \\ log data \\ today.xml’”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接