【问题标题】:script for cron.dailycron.daily 的脚本
【发布时间】:2013-02-21 16:41:45
【问题描述】:

我需要让我的 Java 程序每天在 linux 机器上运行一次。所以我创建了一个只有一行的简单文件:

java -jar /opt/location/my_jar.jar

并将其放入 etc/cron.daily 中,假设它每天运行一次。但它根本不运行。我尝试使用 .sh 扩展名,或者只是没有扩展名的文件名。尽管如此,还是没有运气。

我用谷歌搜索了它,我得到了很多相互矛盾的信息。有人可以帮忙吗?

编辑:

根据 Satish 和 Mithrandir 给出的答案,我正在总结它现在的位置。

1.我使用 vi 创建了 run_conversions 脚本,以解决 Windows 上的行尾字符问题。现在脚本是

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

2.我把它放在 /etc/cron.hourly 中。

3.检查 /var/log/cron 的日志我看到它每小时开始 run_conversions 并完成 run_conversions。到目前为止,一切都很好。

4.但是我的 jar 文件似乎没有运行。我知道这一点,因为当它正常运行时,它应该更新数据库——而数据库没有更新。

5.奇怪的是:当我手动运行 cron.hourly 时,却调用了

run-parts /etc/cron.hourly

jar 文件被正确命中,并且数据库正在更新。

总结一下:通过 run-parts 运行它时,它可以工作。当让它每小时运行一次时,它不会。

有什么想法吗?

编辑2:

根据 Satish、Mithrandir 和 vahid 的建议,我将 run_conversions_loc 更改为如下所示:

#!/bin/bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bexport SHELL=/bin/bash
/usr/bin/java -jar /opt/tf/conversions/aff_networks2.jar > /opt/tf/conversions/runconversions.txt

我从 cron.hourly 中删除了脚本并将这一行添加到 crontab:

*/10 * * * * /opt/tf/conversions/run_conversions_loc

该脚本现在每 10 分钟运行一次,并在 cron 日志中注册如下:

Feb 24 09:30:01 backsome CROND[7933]: (root) CMD (/opt/tf/conversions/run_conversions_loc)

到目前为止,它看起来不错。但是数据库——它应该更新——没有更新。

深入研究,jar 文件 aff_networks2.jar 正在本地目录中寻找ftr.properties 文件——它所在的目录。该文件存在于该目录中。但它没有正确读取。我知道这是因为在输出文件 runco​​nversions.txt 中,应该从属性文件中读取的值是 null。

完成图片的两件事:

  1. 转换目录中的所有内容都有 777 权限。我知道不建议提供这样的扩展权限,但我想确保(至少尝试)这不是问题。

  2. 当我通过调用 ./run_conversions_loc 从 shell 运行脚本时,它会运行、查找属性文件并更新数据库。我以 root 身份登录到 shell,我还以 root 身份创建了所有相关文件,并以 root 身份安装了用于在 crontab 中调用脚本的行。

知道为什么 cron 不读取属性文件吗?

【问题讨论】:

  • 你检查 /var/log/cron 了吗?
  • 感谢您的提示,萨蒂什。我现在检查了一下,那里没有提到我的脚本,尽管现在我把它放在 cron.daily 和 cron.hourly 中,并遵循下面的 Mithrandir 建议。知道发生了什么吗?
  • 创建一个类似于@Mithrandir 的 shell 脚本,并在命令上手动运行 cron,例如:run-parts /etc/cron.daily 并检查您的日志
  • 你的操作系统是什么?和shell 使用的是什么?尝试 #!/bin/bash 另一件事也使用完整路径而不是 java。无论您的 java 位于何处,都可以使用 /usr/bin/java。
  • 啊!知道这是你的编辑器问题,试试这个命令:dos2unix scriptname.sh 也在这里查看更多细节stackoverflow.com/questions/2920416/…

标签: linux cron


【解决方案1】:

可能是你的环境变量

执行脚本时是否以当前用户登录的方式工作?

如果是这样

运行:

env|egrep "(^PATH=|^SHELL=)"|awk '{print "export "$1}'

然后将输出放在脚本的顶部,然后在 2 分钟后尝试另一个 cron,看看它是否有效

针对 Eddy 2013 年 2 月 24 日的评论更新了答案。

我想给你一个关于 crontab 的速成课程。

  1. 设置 crontab 可以通过全局 /etc/crontab 或在用户下作为 crontab -e(编辑特定用户的 cron)或 crontab -l(列表 - 每个用户存储在 /var/spool/cron 中)李>

我看到您尝试每 10 分钟运行一次,这在 /etc/crontab 中很好

我建议提供当前 shell 的整个类路径的原因是因为大多数时候脚本试图使用一个 unix 命令,该命令不能作为 crontab 的 PATH 的一部分(位于最顶部/etc/crontab 文件本身)

要调试路径问题,通常最好查看 crontab 正在执行任务的用户邮箱: 所以 tail -100 /var/spool/mail/root 并按照某人的建议查找与该 cron 任务相关的任何消息以及 cron 日志本身 -

我不认为你的问题是这里的路径..

您正在尝试运行一个 java jar 文件,并且您的 jar 文件可能需要该转换文件夹中的其他文件,并且当您运行它时您已经在该文件夹中......

所以在你的脚本中你可以运行

cd /opt/tf/conversions/;
 /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

但由于这是一个如此小的脚本,您可以将整个内容作为一个 cron 条目并完全绕过 shell 脚本,就像这样

*/10 *    * * *   root cd /opt/tf/conversions/; /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

希望这有助于解决这个问题

【讨论】:

  • 这是输出: export SHELL=/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr /bin:/root/bin 但这是什么意思?我应该把它放在 #!/bin/sh 行之前还是之后?
  • 这是你当前的路径和你当前的shell作为你登录的用户。把它放在#!/bin/sh 之后。然后,这将在作为 cron 的一部分运行的脚本中导出相同的路径。如果这可行,您可以查看 crontab 文件的前几行,并确保路径匹配或具有当前路径中列出的缺失路径 - 这使脚本在您登录时工作,但在 crontab 中运行时不工作
  • 我按照您的建议采取了行动,并用更多信息编辑了问题(编辑 2。)如果您能看一看,那就太好了。
  • 非常感谢,瓦希德。你明白了!
【解决方案2】:

示例解决方案:

在命令行手动运行命令:

[root@04 cron.daily]# /usr/bin/java -jar /root/HelloWorld.jar
Hello World #1

让我们在 /etc/cron.daily/test.sh 中创建一个脚本并赋予执行权限:

#!/bin/bash
/usr/bin/java -jar /root/HelloWorld.jar

注意事项:运行dos2unix以防您遇到dos字符问题或错误/bin/bash^M: bad interpreter: No such file or directory

[root@04 cron.daily]# unix2dos test.sh
unix2dos: converting file test.sh to DOS format ...

测试一下,瞧!!

[root@04 cron.daily]# run-parts /etc/cron.daily
/etc/cron.daily/ldiscan:

kcore: Value too large for defined data type
/etc/cron.daily/test.sh:

Hello World #1

【讨论】:

  • 谢谢你,萨蒂什。你让我更近了,它接缝了,但还没有完全在那里。我用更多信息编辑了我的问题。
  • 让我们用 * * * * * 将该脚本放在 crontab 中
  • Satish 你能详细说明一下吗?我不确定那是什么意思。
  • 运行“crontab -e”命令并添加行 * * * * * /path/of/your/run_conversions 在此处查看帮助thegeekstuff.com/2009/06/15-practical-crontab-examples
  • 我听从了你的建议,并用更多信息编辑了问题(编辑 2。)如果你能看一下会很棒。
【解决方案3】:

将您的文件更改为:

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

检查/usr/bin/java 是否实际上是安装命令的位置 (which java)。 将文件的权限更改为可执行:

chmod +x /opt/location/my_jar.jar

【讨论】:

  • 谢谢,米斯兰迪尔。我会试试的。如果扩展名是 .sh,或者没有扩展名,这有什么关系吗?
  • 第一行定义了脚本而不是 .sh 或 .whatever 即你可以称它为 script.something 并且只要 shell 设置在脚本的第一行它就可以工作
  • 这很重要——至少在 debian 上,cron.daily 由 run-parts(8) 运行,它会跳过包含点的文件名
  • 我用更多信息编辑了这个问题(编辑 2。)如果你能看一下就好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多