代码之家  ›  专栏  ›  技术社区  ›  BCS

以cron的方式运行命令,但从命令行

  •  2
  • BCS  · 技术社区  · 15 年前

    我有一个脚本,我想从cron那里运行。当我从bash运行它时,它工作得很好。然而,当我让克罗恩做这件事的时候,我得到一个:

    myscript.sh:第122行:语法错误:意外的文件结尾

    我想要的是一种像cron作业一样运行命令的方法,但是在shell中执行它。

    旁注:有人知道在克罗恩手下会有什么不同吗?(脚本已经有一个 #!/bin/sh 线)


    为了回答我自己的问题:我把这个添加到了我的crontab中:

    *  *   * * *    bcs     for ((i=$(date +\%M); i==$(date +\%M) ;)) ; do find ~/.crontemp/ -name '*.run' -exec "{}" ";" ; sleep 1; done`
    

    并创建了这个脚本:

    #!/bin/sh
    tmp=$(mktemp ~/.crontemp/cron.XXXXX)
    mknod $tmp.pipe p
    mv $tmp $tmp.pre
    echo $* '>' $tmp.pipe '1>&2' >> $tmp.pre
    echo rm $tmp.run >> $tmp.pre
    chmod 700 $tmp.pre
    mv $tmp.pre $tmp.run
    cat $tmp.pipe
    rm $tmp.pipe
    

    有了它,我可以运行一个延迟不超过一秒钟的任意命令。

    (是的,我知道这里面有各种各样的安全问题)

    问题是 fi VS if 问题。呸!

    3 回复  |  直到 15 年前
        1
  •  1
  •   psmears Touffy    15 年前

    它有很多功能——输出将被重定向到其他地方;环境变量几乎肯定是不同的,等等。根据您所提供的信息,它可能与bash和/bin/sh之间的差异有关(在某些系统上,包括debian/ubuntu风格的Linux,这些系统支持略有不同的T语法)。cron通常使用/bin/sh运行您给它的命令。

    试运行:

    /bin/sh -c '<command>'
    

    在哪里? <command> 来自你的crontab。(当然,如果该命令使用 '' 报价单您需要相应地修改它…)

        2
  •  5
  •   eemz    15 年前

    当一个脚本以交互方式工作并且在cron中失败时,它几乎总是一个路径问题。cron作业进程中的默认路径比交互式会话中的路径短得多。典型的结果是,您试图运行的某个系统实用程序出现了一个“找不到”错误,该系统实用程序不在cron中的路径上。

    我猜您试图运行的某个命令不在路径上,因此它应该创建的文件是空的,而试图读取该文件的命令将向您提供此错误消息。

        3
  •  2
  •   Sagara    15 年前

    您的crontab中可能有“%”。 必须对其进行转义(使用“\”号),否则它将以换行符形式更改。