【问题标题】:KShell script skips commands when scheduled in cronKShell 脚本在 cron 中安排时跳过命令
【发布时间】:2016-03-14 22:56:55
【问题描述】:

我有一个执行 java 程序的 Kshell 脚本。

/path/to/java -jar jarfile.jar some parameters > log
Same line 5 times with different parameters appending output to log file.
cat log | mail -s email@email.com

我一直遇到的问题是,当我将此脚本放入 cron 时,仅执行获取日志文件和发送电子邮件的最后一行。所有上述实际功能所需的行都被忽略。我在 cron 预定时间收到一封空白电子邮件,但脚本需要大约 1 小时。

但是当我手动运行脚本时,它工作正常。

【问题讨论】:

    标签: shell unix cron


    【解决方案1】:

    “Kshell”是 Korn Shell 吗?在> log 后面加上2>&1 也可以将错误消息邮寄给您。他们可能会告诉你出了什么问题。

    【讨论】:

    • 是的,它的 Korn 外壳。 java代码甚至没有执行。日志中没有条目。
    • 当您重定向错误输出(2>&1)时,您应该至少会收到一些错误消息,例如/path/to/java: not found。您能否使用日志文件的完整路径,例如/tmp/log ?
    • 我加了 2>&1 如你所说。日志中没有条目。是的,我正在使用日志文件的完整路径。我在 cron 邮件中注意到的一件事是“无法访问 jarfile.jar”和“cat:0652-050 ​​无法打开 /path/to/log”。顺便说一句,日志和 jarfile.jar 具有完全权限
    • 你确定,脚本是在ksh下执行的吗?您是否确认您没有来自环境的依赖项? cron 上的脚本有一个非常不同(简化)的环境。我建议你跟踪脚本的执行(我认为在 ksh 中这也是 set -x)并分析输出。
    • 谢谢大家的回复。我已经解决了问题
    【解决方案2】:

    我检查了 cron 邮件是否有问题。对于“无法访问 jarfile.jar”,我在脚本中添加了完整路径,对于“cat: 0652-050 ​​无法打开 /path/to/log”,我事先使用 touch 命令创建了日志文件。现在我的脚本看起来像这样。

    touch /path/to/log
    /path/to/java -jar /path/to/jarfile.jar some parameters > /path/to/log
    Same line 5 times with different parameters appending output to log file.
    cat /path/to/log | mail -s email@email.com
    

    我知道给出绝对路径是避免这类问题的关键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2019-04-25
      • 2020-08-20
      相关资源
      最近更新 更多