0

我对服务器有限制,因此 Cron/Autosys 不能用于调度 shell 脚本。有没有办法可以从 java 程序中安排 shell 脚本?石英调度器有用吗?有人可以为我提供相同的示例代码吗?

4

5 回答 5

2

以下教程可帮助您安排 shell 脚本。

http://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/

通过使用

Runtime.getRuntime().exec("sh shellscript.sh");

您可以运行 shell 脚本。

于 2012-12-24T11:56:51.970 回答
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 
        }
    }
}

您可以使用线程执行该类。

于 2013-02-24T23:39:11.430 回答
0

这可能对您有用: http: //algorithmicallyrandom.blogspot.in/2009/11/tips-and-tricks-scheduling-jobs-without.html

您可以使用该at命令。

于 2012-12-24T11:56:02.153 回答
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
于 2012-12-24T11:58:07.567 回答
0

是的,您可以使用Quartz从 Java 中安排您的任务。然后,您的Job实现将调用Runtime.exec(...)来启动 shell 任务,并可能调用一些Process方法来与任务交互。一些技巧:

  • 当你要启动一个 shell 脚本时,而不是直接调用你的 shell 脚本,Runtime.exec(...)你应该调用你的shell 可执行文件 并将你的 shell 脚本作为参数传递。也就是说/path/to/your/shell/script.sh,您应该 exec而不是 exec'ing sh /path/to/your/shell/script.sh

  • Quartz 调度程序支持 cron 表达式,请参阅CronTrigger和Quartz中支持的 cron 表达式的教程

  • 显然,Quartz 调度程序作业只会在您运行 JVM 且 Quartz 调度程序服务启动的情况下运行。通常,您在实施工作时需要考虑到这一点。

  • 此外,如果您不实现某种作业持久性,例如JobStoreCMT,您可能会跳过作业执行,并且动态调度的作业执行将无法在重新启动后继续存在。

于 2012-12-24T12:19:28.553 回答