KShell 脚本在 cron 中安排时跳过命令

KShell 脚本在 cron 中安排时跳过命令

我有一个执行 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 protected]

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

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

答案1

我检查了 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 protected]

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

答案2

这是老生常谈的“cron 及其非常非常简单的环境”问题。当您在自己的 shell 中运行脚本时,您启动的进程处于由您的配置文件设置的环境中。但是,您的 cron 作业在非常基本的环境中启动,缺少一堆变量和路径信息。实际上,可以通过查看 cron 发送的有关其运行的邮件或 cron 守护程序的全局日志来猜测这一点。

当您使用 ksh 时,我建议在脚本开头引用 .kshrc 或 .profile:

. /home/yourid/.kshrc
. /home/yourid/.profile

相关内容