我对服务器有约束,因此Cron / Autosys不能用于调度shell脚本。有没有办法从java程序安排shell脚本?石英调度器有用吗? 有人可以为我提供相同的示例代码。
答案 0 :(得分:2)
以下教程可帮助您安排shell脚本。
http://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/
使用
Runtime.getRuntime().exec("sh shellscript.sh");
您可以运行shell脚本。
答案 1 :(得分:1)
您可以使用ProcessBuilder类从java外部执行任何进程,包括批处理文件。这里有Executing another application from Java例子。
使用小间隔创建线程检查时间而不是计时器类可能会解决时间依赖性。
public class Test implements Runnable {
void run () {
while(true) {
if(myTime != currentTime) {
// check for the time until your time has come
// if not, sleep and continue
sleep(1000);
continue;
}
// Do your job and exit when necessary
}
}
}
您可以使用线程执行该类。
答案 2 :(得分:0)
这可能对您有用:http://algorithmicallyrandom.blogspot.in/2009/11/tips-and-tricks-scheduling-jobs-without.html
您可以使用at
命令。
答案 3 :(得分:0)
你可以使用计时器:
int loopTime = 1000*60*60*12;
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
public void run()
{
Runtime.getRuntime().exec("your java command: java -classpath...");
}
},0, loopTime); //0 is for delay time in ms, loopTime is also in ms
答案 4 :(得分:0)
是的,您可以使用Quartz从Java安排任务。然后,您的Job实现将调用Runtime.exec(...)来启动shell任务,并可能使用一些Process方法与任务进行交互。一些提示:
当您要启动shell脚本时,不应直接使用Runtime.exec(...)
调用shell脚本,而应调用 shell可执行文件并将shell脚本作为参数传递。也就是说,您应该执行/path/to/your/shell/script.sh
而不是执行sh /path/to/your/shell/script.sh
。
Quartz调度程序支持cron表达式,请参阅Quartz中的CronTrigger和tutorial on supported cron expressions。
显然,Quartz调度程序作业只有在运行Quartz Scheduler服务的JVM运行时才会运行。通常,在实施工作时需要考虑到这一点。
此外,如果您没有实现某种类型的作业持久性,例如JobStoreCMT,您可能会跳过作业执行,并且动态调度的作业执行将无法在重新启动后继续存在。