web-dev-qa-db-fra.com

Planificateur de tâches Windows pour exécuter des tâches en quelques secondes

Je recherche un planificateur de tâches open source/gratuit pour Windows 7 (ordinateur de développement) qui me permette de planifier des tâches (demandes HTTP à un service Web) de s'exécuter toutes les x secondes.

J'ai essayé quelques clones Cron et le planificateur de tâches de Windows, mais aucun ne semble autoriser l'exécution de tâches à des intervalles inférieurs à 60 secondes. Est-ce que je manque quelque chose? Si possible, je ne veux pas non plus aller écrire des scripts personnalisés.

17
Barry Jordan

Il est possible de créer plusieurs déclencheurs pour une tâche planifiée. Si vous créez 59 déclencheurs identiques avec un décalage de 1 seconde les uns des autres et planifiez l'exécution de la tâche elle-même toutes les minutes, vous terminez l'exécution de la tâche planifiée toutes les secondes.

Vous pouvez créer ces 59 déclencheurs manuellement à l'aide de l'interface graphique. Cependant, un moyen beaucoup plus rapide de créer autant de déclencheurs consiste à créer une tâche avec un ou deux déclencheurs, à l'exporter dans un fichier texte, à dupliquer les lignes correspondantes, à modifier les décalages de départ en conséquence, puis à réimporter le fichier.

30
Andre

J'ai été en mesure de réaliser cela.

Mise à jour: Il semble que j'ai trop compliqué.

Dans le déclencheur, où il est écrit "Répéter la tâche tous les:" vous pouvez réellementTAPERdans le menu déroulant "1 minute" (il ne vous laissera pas taper le temps en secondes )

Je l'ai fait sur un ordinateur Windows 7.

De plus, je n'ai clairement pas assez lu la question, car le demandeur semble avoir déjà réussi à réduire le temps à 1 minute. Cependant, je laisserai cette réponse ici, car elle expliquera aux futurs lecteurs comment réduire le temps à une minute.

Il semble que vous ne pouvez pas le faire fonctionner à un intervalle de moins d'une minute.


J'ai configuré une tâche avec un déclencheur défini sur Tous les jours pour qu'il se reproduise. Je coche la case "Répéter la tâche tous les:". Réglage sur 5 minutes pour une durée de 1 jour

Cela rend la tâche éternelle, toutes les 5 minutes.

J'ai ensuite exporté la tâche. Il exporte dans un fichier .xml.

Sous Task > Triggers > CalendarTrigger > Repeition il y a la balise suivante: <Interval>PT5M</Interval> Je l'ai changé de PT5M à PT1M. J'ai réimporté la tâche.

La tâche s'exécute maintenant toutes les 1 minute.

Je n'ai pas complètement testé cela, et je n'ai pas essayé avec moins d'une minute, mais cela pourrait être possible en mettant PT30S ou quelque chose pendant 30 secondes. Je vais l'essayer et faire rapport. Mise à jour: Vous ne pouvez pas faire cela, vous obtenez une erreur lors de l'importation de la tâche. Il n'est pas possible de régler cette heure à moins de 1 minute.

La gâchette entière ressemble à ceci pour moi:

  <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>
6
kralco626

J'ai googlé ceci à mort, donc autant que je sache, la réponse est qu'il n'y en a pas. Il existe de nombreuses solutions commerciales, mais pas de programmes open source/gratuits.

J'ai fini par écrire un ordonnanceur HTTP GET périodique très simple en Java en utilisant quartz scheduler . Il peut être utile à d’autres de poster un lien vers la source sur guthub https://github.com/bjordan/simple_Java_periodic_HTTP_scheduler

3
Barry Jordan

Explication brève: le programme principal lance un processus de service qui restera actif en mémoire et activera périodiquement un travail - faire quelque chose.

 Job scheduler

  1. Créez une classe qui étend la classe System.ServiceProcess.ServiceBase
  2. Implémenter au moins les méthodes OnStart et OnStop
  3. Démarrer et utiliser le planificateur Quartz.NET dans OnStart pour exécuter des tâches périodiquement

Voici mon modèle de solution C # pour un service Windows et un démon Linux dans .NET/Mono https://github.com/mchudinov/ServiceDemon Et un court article de blog à ce sujet

    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"]);
        }
    }
 </ code>
0
Mikael Chudinov