[英]script for cron.daily
我需要每天一次在Linux机器上运行Java程序。 所以我创建了一个只有一行的简单文件:
java -jar /opt/location/my_jar.jar
并假设它每天运行一次,然后将其放入etc / cron.daily。 但是它根本没有运行。 我尝试都使用.sh扩展名,或者仅使用不带扩展名的文件名。 仍然没有运气。
我在Google上搜索了一下,但是却得到了很多相互矛盾的信息。 有人可以帮忙吗?
编辑:
根据Satish和Mithrandir给出的答案,我正在总结当前的位置。
1.我使用vi创建了run_conversions脚本,以解决Windows上行尾字符的问题。 现在脚本是
#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar
2.我每小时将它放在/ etc / cron。
3.在/ var / log / cron处检查日志,我发现它每小时开始运行run_conversions和结束run_conversions。 到现在为止还挺好。
4.但是好像我的jar文件没有运行。 我知道这是因为,当它正常运行时,它应该更新数据库-并且数据库没有更新。
5,奇怪的是:我每小时手动运行cron。
run-parts /etc/cron.hourly
jar文件被正确击中,并且数据库正在更新。
总结一下:在运行部件中运行时,它可以工作。 如果让它自己每小时运行一次,则不会。
有任何想法吗?
编辑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
文件。 该文件存在于此目录中。 但是它没有被正确读取。 我知道这一点是因为在输出文件runconversions.txt中,应从属性文件读取的值为null。
完成图片的两件事:
转换目录中的所有内容都具有777权限。 我知道不建议授予此类扩展权限,但我想确保(至少尝试)这不是问题。
当我通过调用./run_conversions_loc
从外壳运行脚本时,脚本将运行,查找属性文件并更新数据库。 我以root用户身份登录到Shell,还以root用户身份创建了所有相关文件,并以root用户身份安装了在crontab中调用脚本的行。
有什么想法为什么不cron读取属性文件?
示例解决方案:
在命令行上手动运行命令:
[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
注意:如果您遇到dos字符问题或错误/bin/bash^M: bad interpreter: No such file or directory
运行dos2unix
/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
它可能是您的环境变量
在执行脚本时,当前用户是否可以登录?
如果是这样的话
跑:
env|egrep "(^PATH=|^SHELL=)"|awk '{print "export "$1}'
然后将输出结果放到脚本的顶部,然后从现在开始的2分钟内尝试另一个cron看看它是否有效
更新了答案,以回应Eddy 2013年2月24日的评论。
我想为您提供有关crontab的速成课程。
我看到您正在尝试尝试每次运行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
希望这有助于解决这个问题
将文件更改为:
#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar
检查/usr/bin/java
是否实际上是命令所在的位置( which java
)。 将文件的权限更改为可执行文件:
chmod +x /opt/location/my_jar.jar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.