我正在寻找一个适用于Windows 7(开发机器)的开源/免费任务调度程序,它允许我安排任务(对Web服务的HTTP请求)每隔x秒运行一次。
我已经尝试了几个Cron克隆和Windows自己的任务计划程序,但似乎都不允许任务以少于60秒的间隔运行。我错过了什么吗?如果可能的话,我不想去编写任何自定义脚本。
答案 0 :(得分:31)
可以为一个计划任务创建多个触发器。如果创建59个相同的触发器,彼此偏移量为1秒,并安排任务本身每分钟运行一次,则最终会使计划任务每秒运行一次。
您可以使用GUI手动创建这59个触发器。但是,创建这么多触发器的更快捷的方法是创建一个带有一个或两个触发器的任务,将其导出到文本文件,复制相应的行,相应地更改起始偏移,然后重新导入该文件。
答案 1 :(得分:6)
我实际上能够做到这一点。
更新:似乎我过度复杂了。
在触发器中,它显示“每次重复任务:”,您实际上可以 TYPE 进入下拉列表“1分钟” (它不会让你以秒为单位输入时间)
我是在Windows 7机器上完成的。
另外,我显然没有充分阅读这个问题,因为提问者似乎已经能够把时间缩短到1分钟。但是,我会在这里留下这个答案,因为它将为未来的读者解释如何将时间缩短到一分钟。
好像你不能让它以不到一分钟的间隔运行。
我设置了一个触发器设置为每日的任务,每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>
答案 2 :(得分:3)
我已经用Google搜索过去,所以据我所知,答案是没有。有很多商业解决方案,但没有开源/免费程序。
我最终使用quartz scheduler在java中编写了一个非常简单的定期HTTP GET调度程序。它可能对其他人有用,因此在guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler
上发布指向源的链接答案 3 :(得分:0)
简短说明: 主程序启动一个服务进程,该进程将在内存中保持活动状态并定期激活作业 - 执行某些操作。
这是我用于Windows服务的模板C#解决方案和.NET / Mono中的Linux恶魔https://github.com/mchudinov/ServiceDemon 并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"]);
}
}
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"]);
}
}