Windows 任务调度程序可在几秒钟内执行任务

Posted

技术标签:

【中文标题】Windows 任务调度程序可在几秒钟内执行任务【英文标题】:Windows task scheduler to execute tasks in seconds 【发布时间】:2011-12-07 20:25:46 【问题描述】:

我正在寻找适用于 Windows 7(开发机器)的开源/免费任务调度程序,它允许我调度任务(对 Web 服务的 HTTP 请求)以每 x 秒运行一次。

我已经尝试了几个 Cron 克隆和 windows 自己的任务计划程序,但似乎都不允许任务以小于 60 秒的间隔运行。我错过了什么吗?如果可能的话,我也不想编写任何自定义脚本。

【问题讨论】:

你考虑过Quartz.NET吗? @Nando - 我们使用的是基于 Java 构建的 Coldfusion,所以我已经查看了 quartz-scheduler.org。我正在寻找一个不需要编写自定义代码的程序,只是一个桌面或命令行程序,它允许我以 1 到 60 秒的间隔发出 HTTP 请求。 那我猜你在Super User提问可能会更好,因为这个网站主要是为了编程问题。 @BarryJordan 您能否考虑将您接受的答案移至一个或其他答案?它为未来的用户提供了比您自己更好的答案。 【参考方案1】:

可以为一项计划任务创建多个触发器。如果您创建 59 个相同的触发器,彼此偏移 1 秒,并将任务本身安排为每分钟运行一次,那么您最终将安排的任务每秒运行一次。

您可以使用 GUI 手动创建这 59 个触发器。但是,创建这么多触发器的更快方法是创建一个包含一个或两个触发器的任务,将其导出到文本文件,复制相应的行,相应地更改起始偏移量,然后重新导入文件。

【讨论】:

我不得不添加两个任务,因为我只能在 0 - 47 秒内添加触发器,然后才会遇到错误(我认为是架构错误)。 查看this related superuser post-您只需要从不同的秒偏移量开始设置多个触发器。 @SilverNinja 感谢您提及相关帖子。他正在做我上面描述的事情。我编辑了我的答案以澄清与使用 GUI 相比,文本文件解决方案只是设置触发器的一种更方便的方法,尤其是在设置每秒运行的任务时(而不是像超级用户答案中那样每 10 秒运行一次) 对于开发 Windows 任务计划程序的人来说,地狱中一定有一个特殊的地方【参考方案2】:

我确实做到了。

更新:似乎我过于复杂了。

在触发器中,它显示 “每隔:重复一次任务:” 您实际上可以 TYPE 进入下拉列表 “1 分钟” (它不会让你以秒为单位输入时间)

我是在 Windows 7 机器上完成的。

另外,我显然没有很好地阅读这个问题,因为提问者似乎已经能够将时间缩短到 1 分钟。但是,我将把这个答案留在这里,因为它将向未来的读者解释如何将时间缩短到一分钟。

您似乎无法让它以少于一分钟的间隔运行。


我设置了一个任务,触发器设置为 Daily,每 1 天重复一次。 我选中了“每隔一个重复任务:”框。将其设置为 5 分钟,持续 1 天

这使任务永远进行,每 5 分钟一次。

然后我导出了任务。它导出为 .xml 文件。

Task > Triggers > CalendarTrigger > Repeition 下有以下标签:<Interval>PT5M</Interval> 我将它从PT5M 更改为PT1M。我重新导入了任务。

该任务现在每 1 分钟运行一次。

我还没有完全测试过这个,我没有尝试过不到一分钟,但可以通过将PT30S 或其他东西放置 30 秒来实现。我会尝试并报告回来。 更新:您不能这样做,导入任务时会出错。无法将此时间设置为小于 1 分钟。

整个触发器对我来说是这样的:

  <Triggers>
    <CalendarTrigger>
      <Repetition>
        <Interval>PT1M</Interval>
        <Duration>P1D</Duration>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
      <StartBoundary>2013-11-07T17:04:51.6062297</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>

【讨论】:

这应该是公认的答案,比创建 59 个触发器要简单得多! OP 指定他们希望每 x 秒而不是每分钟运行一次任务,这对于这个答案的解决方案是不可能的。所以它可能更简单,但解决了 60 个触发器之外的另一个问题。【参考方案3】:

我已经用谷歌搜索了这个,所以据我所知,答案是,没有。有很多商业解决方案,但没有开源/免费程序。

我最终使用quartz scheduler 在java 中编写了一个非常简单的周期性HTTP GET 调度程序。它可能对其他人有用,因此在guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler上发布指向源的链接

【讨论】:

安息吧,我的朋友。【参考方案4】:

简短说明: 主程序启动一个服务进程,该进程将在内存中保持活动状态,并定期激活一项工作——做点什么。

    创建一个扩展 System.ServiceProcess.ServiceBase 类的类 至少实现方法 OnStart 和 OnStop 在 OnStart 中启动并使用 Quartz.NET 调度程序定期运行任务

这是我的模板 C# 解决方案,用于 .NET/Mono https://github.com/mchudinov/ServiceDemon 中的 Windows 服务和 Linux 恶魔 还有a short blogpost about it

    class Program
    
        public static void Main(string[] args)
        
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]  new ServiceDemon.Service() ;
            ServiceBase.Run(ServicesToRun);
        
    

    public class Service : ServiceBase
    
        static IScheduler Scheduler  get; set; 

        protected override void OnStart(string[] args)
        
            StartScheduler();
            StartMyJob();
        

        protected override void OnStop()
        
            Scheduler.Shutdown();
        

        void StartScheduler()
        
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            Scheduler = schedFact.GetScheduler();
            Scheduler.Start();
        

        void StartMyJob()
        
            var seconds = Int16.Parse(ConfigurationManager.AppSettings["MyJobSeconds"]);
            IJobDetail job = JobBuilder.Create<Jobs.MyJob>()
                .WithIdentity("MyJob", "group1")
                .UsingJobData("Param1", "Hello MyJob!")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("MyJobTrigger", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
                .Build();

            Scheduler.ScheduleJob(job, trigger);
        
    

    public class MyJob : IJob
    
        public void Execute(IJobExecutionContext context)
        
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            log.Info(dataMap["Param1"]);
        
    

【讨论】:

请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(相对于另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。

以上是关于Windows 任务调度程序可在几秒钟内执行任务的主要内容,如果未能解决你的问题,请参考以下文章

621. 任务调度器

[LeetCode]621. 任务调度器(贪心)

leetcode_37其它---- 任务调度器

leetcode_37其它---- 任务调度器

#yyds干货盘点# leetcode算法题:任务调度器

.NET Core Windows 服务中的并行任务在几秒钟后挂起