昨天我花了好几个小时才发现,令我惊讶的是,W10 TaskScheduler 显然是垃圾。
我有两个重复的任务,都是为了使用一款出色的备份应用程序提供的快照机制进行备份,该应用程序名为雷斯蒂奇。我的 restic 命令是从 Python 脚本运行的,该脚本本身是从 .bat 文件调用的,这些任务被要求重复运行。
一项任务每 10 分钟重复一次,对内部硬盘进行快照模式,另一项任务每小时重复一次,对外部硬盘进行快照模式。它们都使用相同的 Python 脚本文件。
在我决定以“隐藏”方式运行这些作业(即每次运行作业时都不会闪烁命令提示符窗口)之前,我似乎可以毫无问题地并行运行这些命令:它们都记录到同一个日志文件中,并且这样做没有任何问题。偶尔,它们会同时记录,这会导致 Python 的logging
模块向发出投诉stderr
,而我将其定向到一个特殊的 stderr 文件。但这种情况不会干扰作业的运行。
很自然地,我最终将两个任务都设置为“隐藏”运行。从那时起,我遇到了各种各样的问题,似乎无论我做什么。我让它们运行单独的 .py 程序。以及单独的 .bat 脚本。并将 stderr 输出到不同的文件。我将“如果任务已在运行,则适用以下规则”的设置从“不启动新实例”更改为“并行运行新实例”。我将“如果任务失败,则每隔:”设置为“1 分钟”,并将“尝试重新启动最多:”设置为“10”次。还有更多。
无论我做什么,这些任务中的一个或另一个都会失败,通常是每小时的任务。我已在 TaskScheduler 中为这些任务启用了历史记录,大多数历史记录会显示“启动失败”...但有时它会声称任务已开始和结束(这表明它在同一秒开始和结束),但在 stderr 文件中、在echo
我插入到 .bat 文件中的特殊命令中或 Python 脚本的日志文件中绝对不会有任何痕迹。
一旦“每小时”任务在启动时运行(触发两个任务),然后下一个小时没有运行,然后下一个小时运行。没有任何消息或日志来解释原因。我的工作假设是,由于 restic 应用程序由两个进程运行,因此 TS 认为这是一个问题,即使我明确允许多个实例运行,即使不运行“隐藏”时没有问题。
我相信我已经用尽了这些任务的所有属性选项卡中可用的所有选项。
在我的一生中,我偶尔想对微软说些不客气的话,而且我经常这么说。不过,这次使用这种俗套话的经历并没有给我带来太多的痛苦或血压升高,原因很简单,我现在预料到了这种事情。如果这次经历真的成功了,我会感到惊讶。
从今以后,我的“解决方法”将是使用一个 Python“系统管理员”脚本来协调系统中发生的所有事情,即充当 DIYcron
文件。事实上,我可能会完全避免使用 TaskScheduler,而只需让此脚本从启动时在后台运行:对 W10 的依赖越少,所有相关人员就越高兴。
我是不是太不厚道了?有人能指出我可能没有考虑到的问题吗?请注意,这个脚本必须“以管理员身份”运行(即任务设置“以最高权限运行”),这可能很有趣。