【问题标题】:Getting issue in adding cron expression to crontab from java and CLI从 java 和 CLI 向 crontab 添加 cron 表达式时遇到问题
【发布时间】:2018-06-13 22:38:43
【问题描述】:

我正在运行下面的命令,将两个参数传递给我的脚本文件(下面的命令是从 java 构造的):

sh /home/accure/Desktop/scripts/cronhandler.sh "/home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf" "* * * * */5"

"/home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf" 是第一个参数,"* * * * */5" 是第二个参数,基本上是一个 cron 表达式。

cronhandler.sh 是我的脚本文件,其中包含以下代码:

if [ "$#" -eq 2 ]
then
    echo "Crontab with create & update functionality"
    command=$1
    cron_exp=$2
        echo "cron_exp=$cron_exp"
        echo "command=$command"
        cron_exp=`echo $cron_exp | sed 's/"//g' `
        command=`echo $command | sed 's/"//g' `
        echo "cron_exp=$cron_exp"
        echo "command=$command"
    if [[ "$cron_exp" != " " && "$command" != " " ]]
    then
                crontab -l | grep -q "$command"
        if [ $? -eq 0 ]
        then
                        crontab -l | grep -v "$command" | crontab -
            echo "CRON entry deleted successfully.."
        else
            echo "CRON entry deletion failed."
        fi
                crontab -l | grep -q "$command" || (crontab -l 2>/dev/null; echo "$cron_exp $command") | crontab -
        if [ $? -eq 0 ]
        then
            echo "CRON entry added successfully.."
        else
            echo "CRON entry addition failed."
        fi      
    fi
fi

我在运行脚本时遇到的错误如下。实际上它是从当前工作目录中列出我的文件和文件夹,而不是将 cron 表达式添加到 cron 选项卡。

具有创建和更新功能的 Crontab cron_exp=* * * * */5 命令=/home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf cron_exp=14.5 LinkedList vs Java中的ArrayList-QWMyhFUtFHo.mp4 [57.64911004342139,10.407439861446619] accure-facebook-parser-1.0-SNAPSHOT-jar-with-dependencies.jar apache-tomcat-7.0.41 Core Java with OCJP_SCJP - Collections Part-11 _ Map_Hashmap_链接Hashmap-pSGvbJ7GJ68.mp4.part桌面文档 下载 epel-release-6-8.noarch.rpm HashMap 如何在 Java 中工作 动画!! java8 教程中的新内容-c3RVW3KGIIE.mp4 摄取 Java 采访 - Hashmap 的工作原理 -YR7Vp7HcAgs.mp4 jce_policy-8.zip mongodata 音乐 netbeans-7.4 NetBeansProjects 图片公开类星体 robomongo-0.8.4-x86_64 sa softs solr-6.2.1 solr-6.2.1.tgz 模板 testdata UnlimitedJCEPolicyJDK8 视频 Vinod 14.5 LinkedList vs Java中的ArrayList-QWMyhFUtFHo.mp4 [57.64911004342139,10.407439861446619] accure-facebook-parser-1.0-SNAPSHOT-jar-with-dependencies.jar apache-tomcat-7.0.41 Core Java with OCJP_SCJP - Collections Part-11 _ Map_Hashmap_链接Hashmap-pSGvbJ7GJ68.mp4.part桌面文档 下载 epel-release-6-8.noarch.rpm HashMap 如何在 Java 中工作 动画!! java8 教程中的新内容-c3RVW3KGIIE.mp4 摄取 Java 采访 - Hashmap 的工作原理 -YR7Vp7HcAgs.mp4 jce_policy-8.zip mongodata 音乐 netbeans-7.4 NetBeansProjects 图片公开类星体 robomongo-0.8.4-x86_64 sa softs solr-6.2.1 solr-6.2.1.tgz 模板 testdata UnlimitedJCEPolicyJDK8 视频 Vinod 14.5 LinkedList vs Java中的ArrayList-QWMyhFUtFHo.mp4 [57.64911004342139,10.407439861446619] accure-facebook-parser-1.0-SNAPSHOT-jar-with-dependencies.jar apache-tomcat-7.0.41 Core Java with OCJP_SCJP - Collections Part-11 _ Map_Hashmap_链接Hashmap-pSGvbJ7GJ68.mp4.part桌面文档 下载 epel-release-6-8.noarch.rpm HashMap 如何在 Java 中工作 动画!! java8 教程中的新内容-c3RVW3KGIIE.mp4 摄取 Java 采访 - Hashmap 的工作原理 -YR7Vp7HcAgs.mp4 jce_policy-8.zip mongodata 音乐 netbeans-7.4 NetBeansProjects 图片公开类星体 robomongo-0.8.4-x86_64 sa softs solr-6.2.1 solr-6.2.1.tgz 模板 testdata UnlimitedJCEPolicyJDK8 视频 Vinod 14.5 LinkedList vs Java中的ArrayList-QWMyhFUtFHo.mp4 [57.64911004342139,10.407439861446619] accure-facebook-parser-1.0-SNAPSHOT-jar-with-dependencies.jar apache-tomcat-7.0.41 Core Java with OCJP_SCJP - Collections Part-11 _ Map_Hashmap_链接Hashmap-pSGvbJ7GJ68.mp4.part桌面文档 下载 epel-release-6-8.noarch.rpm HashMap 如何在 Java 中工作 动画!! java8 教程中的新内容-c3RVW3KGIIE.mp4 摄取 Java 采访 - Hashmap 的工作原理 -YR7Vp7HcAgs.mp4 jce_policy-8.zip mongodata 音乐 netbeans-7.4 NetBeansProjects 图片公开类星体 robomongo-0.8.4-x86_64 sa softs solr-6.2.1 solr-6.2.1.tgz 模板 testdata UnlimitedJCEPolicyJDK8 视频 Vinod */5 命令=/home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf CRON 条目删除失败。 "-":2: crontab 文件中的严重错误,无法安装。 CRON 条目 添加失败。

注意:cron 表达式中的* 被添加到 crontab 中,而是从当前工作目录中列出我的文件和文件夹。

下面给出了我调用命令行的Java代码:

String pipelineFilePath="sh /home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf";

        String cronExp="* * * * */5";

        pipelineFilePath = "\"" + pipelineFilePath + "\"";

        cronExp = "\"" + cronExp + "\"";

        command = "sh " + /home/accure/Desktop/scripts/cronhandler.sh + " " + pipelineFilePath + " " + cronExp;

        runScript(command);

        public void runScript(String script) throws InterruptedException {
        final String cmd = script;
        Thread runScript = new Thread(new Runnable() {
        public void run() {
            try {
                DefaultExecutor executor = new DefaultExecutor();
                CommandLine commandLine = CommandLine.parse(cmd);
                executor.setExitValue(1);
                int exitValue = executor.execute(commandLine);
            } catch (Exception ex) {
            }
        }
    });
    runScript.start();
    Thread.sleep(10000);
}

【问题讨论】:

    标签: java linux scripting cron


    【解决方案1】:

    尝试在你的论点周围加上单引号 (') 而不是双引号 ("):

    sh /home/accure/Desktop/scripts/cronhandler.sh '/home/accure/Desktop/scripts/pipeline.sh 028d8ccb-4c46-4e02-a9b0-3c97a383daaf' '* * * * */5'
    

    它会阻止你的 shell 的filename expansion

    【讨论】:

    • 谢谢 Ronan..但是这个 shell 命令我是从 java 代码中得到的,我正在通过命令行执行它,如果我放单引号,那么它将不允许传递参数。我可以用 cronhandler 脚本文件做些什么吗?
    • 没有。您的脚本与此无关。它在你的 shell 文件名扩展之后获取参数。您无法在脚本中知道您最初拥有*。您能否将您的 Java 代码添加到问题中以便我为您提供帮助?
    • 添加...它只是构建脚本并调用命令行
    • 这样加单引号怎么样? command = "sh " + /home/accure/Desktop/scripts/cronhandler.sh + " '" + pipelineFilePath + "' '" + cronExp + "'";
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2019-04-28
    • 2011-06-10
    • 2017-09-09
    相关资源
    最近更新 更多