Планировщик задач Windows для выполнения задач в считанные секунды


Я ищу планировщик задач с открытым исходным кодом для Windows 7 (машина разработки), который позволит мне планировать задачи (HTTP-запросы к веб-службе) для запуска каждые x секунд.

Я попробовал пару клонов Cron и собственный планировщик задач windows, но ни один из них не позволяет задачам выполняться с интервалом менее 60 секунд. Я что-то упустил? Я не хочу идти и писать какие-либо пользовательские сценарии, если это возможно.

4 17

4 ответа:

Для одной запланированной задачи можно создать несколько триггеров. Если вы создадите 59 идентичных триггеров со смещением 1 секунда по отношению друг к другу и запланируете выполнение самой задачи каждую минуту, то в конечном итоге запланированная задача будет выполняться каждую секунду.

Вы можете создать эти 59 триггеров вручную, используя графический интерфейс. Однако гораздо более быстрый способ создать так много триггеров-это создать задачу с одним или двумя триггерами, экспортировать ее в текстовый файл, дублировать соответствующие строки, изменить начало смещает соответственно, а затем повторно импортирует файл.

Я действительно смог добиться этого.

Обновление: кажется, я слишком усложнил его.

В триггере, где он говорит "повторять задание каждые:" вы можете на самом деле ввести в раскрывающемся списке "1 минута" (это не позволит вам ввести время в секундах)

Я сделал это на машине с Windows 7.

Кроме того, я явно недостаточно хорошо прочитал вопрос, поскольку Аскер, похоже, уже смог сократить время до 1 минуты. Однако, Я оставлю этот ответ здесь, так как он объяснит будущим читателям, как именно сократить время до одной минуты. Кажется, что вы не можете заставить его работать с интервалом менее одной минуты.

Я поставил задачу с триггером, установленным ежедневно, чтобы повторяться каждые 1 день. Я ставлю галочку в поле " повторять задание каждые:". Установка его на 5 минут в течение 1 дня

Это заставляет задачу идти вечно, каждые 5 минут.

Затем я экспортировал задачу. Его экспорт в .XML-файл.

Под Task > Triggers > CalendarTrigger > Repeition есть следующий тег: <Interval>PT5M</Interval> я изменил его с PT5M на PT1M. Я повторно импортировал задачу.

Задача теперь выполняется каждые 1 минуту. Я не полностью проверил это, и я не пробовал меньше одной минуты, но это может быть возможно, поместив PT30S или что-то в течение 30 секунд. Я попробую и доложу о результатах. Update: вы не можете этого сделать, вы получаете ошибку при импорте задачи. Это не возможно, чтобы установить это время до менее чем 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>

Я загуглил это до смерти, так что, насколько я вижу, ответа нет. Существует множество коммерческих решений,но нет программ с открытым исходным кодом.

В итоге я написал очень простой периодический планировщик HTTP GET на java, используяQuartz scheduler . Это может быть полезно для других, поэтому размещение ссылки на источник на guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler

Краткое объяснение: Основная программа запускает процесс обслуживания, который будет оставаться активным в памяти и периодически будет активировать задание – сделать что-то.

Планировщик

  1. создайте класс, расширяющий систему.Событий.Класс базы обслуживания
  2. реализовать хотя бы методы OnStart и OnStop
  3. запуск и использование Quartz.NET планировщик в OnStart для периодического выполнения задач

Вот мое шаблонное решение C# для службы Windows и демона Linux в .NET / Mono 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"]);
        }
    }