我对服务器有限制,因此 Cron/Autosys 不能用于调度 shell 脚本。有没有办法可以从 java 程序中安排 shell 脚本?石英调度器有用吗?有人可以为我提供相同的示例代码吗?
5 回答
以下教程可帮助您安排 shell 脚本。
http://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/
通过使用
Runtime.getRuntime().exec("sh shellscript.sh");
您可以运行 shell 脚本。
您可以使用 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
}
}
}
您可以使用线程执行该类。
这可能对您有用: http: //algorithmicallyrandom.blogspot.in/2009/11/tips-and-tricks-scheduling-jobs-without.html
您可以使用该at
命令。
你可以使用计时器:
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
是的,您可以使用Quartz从 Java 中安排您的任务。然后,您的Job实现将调用Runtime.exec(...)来启动 shell 任务,并可能调用一些Process方法来与任务交互。一些技巧:
当你要启动一个 shell 脚本时,而不是直接调用你的 shell 脚本,
Runtime.exec(...)
你应该调用你的shell 可执行文件 并将你的 shell 脚本作为参数传递。也就是说/path/to/your/shell/script.sh
,您应该 exec而不是 exec'ingsh /path/to/your/shell/script.sh
。Quartz 调度程序支持 cron 表达式,请参阅CronTrigger和Quartz中支持的 cron 表达式的教程。
显然,Quartz 调度程序作业只会在您运行 JVM 且 Quartz 调度程序服务启动的情况下运行。通常,您在实施工作时需要考虑到这一点。
此外,如果您不实现某种作业持久性,例如JobStoreCMT,您可能会跳过作业执行,并且动态调度的作业执行将无法在重新启动后继续存在。