Windows任务计划程序以秒为单位执行任务

20
我正在寻找一个在Windows 7(开发机器)上可用的开源/免费任务调度器,它将允许我安排任务(向Web服务发送HTTP请求)每x秒运行一次。我尝试了几个Cron克隆和Windows自带的任务计划程序,但似乎都不允许任务以小于60秒的间隔运行。我有什么遗漏的吗?如果可能的话,我也不想编写任何自定义脚本。

你考虑过Quartz.NET吗? - Nano Taboada
@Nando - 我们使用基于Java的Coldfusion进行工作,因此我已经查看了http://www.quartz-scheduler.org。我正在寻找一个不需要编写自定义代码的程序,只需一个桌面或命令行程序,允许我在1到60秒之间进行HTTP请求。 - Barry Jordan
那么我猜你在Super User上提问可能会更加幸运,因为这个网站主要是用来解决编程问题的。 - Nano Taboada
@BarryJordan,你能否考虑将你接受的答案移动到其他答案之一?对于未来的用户来说,它提供了比你自己更好的答案。 - Tschallacka
4个回答

34

可以为一个定时任务创建多个触发器。如果您创建59个相同的触发器,每个偏移1秒,并将任务本身安排在每分钟运行一次,则最终安排的任务将每秒运行一次。

您可以使用GUI手动创建这59个触发器。然而,更快捷的方法是创建一个有一到两个触发器的任务,将其导出到文本文件中,复制相应的行,根据需要更改起始偏移量,然后重新导入文件。


2
我不得不添加两个任务,因为在遇到错误之前(我猜是模式错误),我只能为0-47秒添加触发器。 - baileyswalk
请查看这个相关的superuser帖子 - 你只需要设置多个以不同秒偏移开始的触发器。 - SliverNinja - MSFT
@SilverNinja 感谢您提到相关帖子。他正在做我上面描述的事情。我编辑了我的答案,以澄清文本文件解决方案只是相对于使用GUI更方便地设置触发器的一种方式,特别是在设置每秒运行任务时(而不是像那个superuser答案中每10秒运行一次)。 - Andre
6
谁曾经开发过Windows任务计划程序,应该在地狱里有一个特别的地方。 - niken

13

我实际上成功地做到了这一点。

更新:似乎我把它弄复杂了。

在触发器中,在“重复任务每次:”的位置,你可以输入“1分钟”进下拉菜单(不支持秒数输入)

我在一台Windows 7机器上完成了这个操作。

显然,我没有仔细阅读问题,因为提问者似乎已经能够将时间缩短到1分钟。但是,我将保留这个答案,因为它将为未来的读者解释如何将时间缩短到1分钟。

似乎无法使其以小于一分钟的间隔运行。


我设置了一个触发器,将其设置为每天重复1天。

我勾选了“重复任务每次:”框。将其设置为每5分钟一次,持续1天。

这使得任务每5分钟无限循环。

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

任务> 触发器> 日历触发器> 重复 下有以下标记:<Interval>PT5M</Interval> 我将其从PT5M更改为PT1M。我重新导入了这个任务。

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

我还没有完全测试过,也没有尝试过少于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>

1
这应该是被接受的答案,比创建59个触发器要简单得多! - Geek Josh
1
OP指定他们想要每x秒运行任务,而不是每分钟运行,这是无法通过此答案的解决方案实现的。因此,它可能更简单,但解决了60个触发器之外的另一个问题。 - Andre

3

安息吧,我的朋友。 - user1940676

1

简要说明: 主程序启动一个服务进程,该进程将保持活动状态,并定期激活一个作业 - 执行某些操作。

Job scheduler

  1. 创建一个继承自System.ServiceProcess.ServiceBase类的类
  2. 实现至少OnStart和OnStop方法
  3. 在OnStart中启动并使用Quartz.NET调度器以定期运行任务

这是我为.NET/Mono中的Windows服务和Linux守护进程提供的模板C#解决方案 https://github.com/mchudinov/ServiceDemon 以及有关此解决方案的简短博客文章

    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"]);
        }
    }


请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra

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