[英]How to schedule shell script from java program
我在服务器上有一个约束,因此Cron / Autosys无法用于计划Shell脚本。 有没有办法可以从Java程序安排shell脚本? 石英调度程序有用吗? 有人可以提供相同的示例代码吗?
以下教程可帮助您安排外壳程序脚本。
http://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/
通过使用
Runtime.getRuntime().exec("sh shellscript.sh");
您可以运行shell脚本。
您可以使用ProcessBuilder类从Java外部执行任何进程,包括批处理文件。 这里有一个从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
}
}
}
您可以使用线程执行该类。
您可以使用计时器:
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方法与该任务进行交互。 一些技巧:
在启动外壳脚本时,不要直接使用Runtime.exec(...)
调用外壳脚本,而应调用外壳可执行文件并将外壳脚本作为参数传递。 也就是说,不是exec'ing /path/to/your/shell/script.sh
,你应该Exec的sh /path/to/your/shell/script.sh
。
Quartz Scheduler支持cron表达式,请参阅CronTrigger和有关 Quartz中支持的cron表达式的教程 。
显然,只有在运行了Quartz Scheduler服务的JVM时,Quartz Scheduler作业才会运行。 通常,在实施工作时需要考虑到这一点。
另外,如果您未实现某些作业持久性,例如JobStoreCMT ,则可能会跳过作业执行,并且动态计划的作业执行将无法在重新启动后幸免。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.