繁体   English   中英

如何从Java程序安排Shell脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM