Linux cron.daily的脚本

Linux cron.daily的脚本,linux,cron,Linux,Cron,我需要让我的Java程序每天在linux机器上运行一次。所以我创建了一个简单的文件,只有一行: java -jar /opt/location/my_jar.jar 并将其放入etc/cron.daily,假设它每天运行一次。但它根本不运行。我尝试使用.sh扩展名,或者干脆使用没有扩展名的文件名。不过,运气不好 我在谷歌上搜索了一下,得到了很多相互矛盾的信息。有人能帮忙吗 编辑: 我根据萨蒂什和米特兰迪尔给出的答案总结了现在的情况 1.我使用vi创建了run_conversions脚本,以解决

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

java -jar /opt/location/my_jar.jar
并将其放入etc/cron.daily,假设它每天运行一次。但它根本不运行。我尝试使用.sh扩展名,或者干脆使用没有扩展名的文件名。不过,运气不好

我在谷歌上搜索了一下,得到了很多相互矛盾的信息。有人能帮忙吗

编辑:

我根据萨蒂什和米特兰迪尔给出的答案总结了现在的情况

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

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar
2.我把它放在/etc/cron.hourly中

3.检查/var/log/cron上的日志,我看到它每小时都在开始运行和完成运行转换。到目前为止还不错

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

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

run-parts /etc/cron.hourly
jar文件被正确命中,数据库正在更新

总而言之:当在运行部件中运行它时,它是有效的。当让它自己每小时运行时,它不会

有什么想法吗

编辑2:

根据Satish、Mithrandir和vahid的建议,我将我的跑步转化率改为如下:

#!/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
Feb 24 09:30:01 backsome CROND[7933]: (root) CMD (/opt/tf/conversions/run_conversions_loc)
我从cron.hourly中删除了脚本,并将这一行添加到crontab:

*/10 * * * * /opt/tf/conversions/run_conversions_loc
脚本现在每10分钟运行一次,并在cron日志中注册,如下所示:

#!/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
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

要完成这幅图,有两件事:

  • conversions目录中的所有内容都具有777权限。我知道不建议授予这样的扩展权限,但我想确保(至少尝试一下)这不是问题所在

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

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

    将文件更改为:

    #!/bin/sh
    /usr/bin/java -jar /opt/location/my_jar.jar
    
    检查
    /usr/bin/java
    是否是命令的实际安装位置(
    哪个java
    )。 将文件的权限更改为可执行:

    chmod +x /opt/location/my_jar.jar
    
    将文件更改为:

    #!/bin/sh
    /usr/bin/java -jar /opt/location/my_jar.jar
    
    检查
    /usr/bin/java
    是否是命令的实际安装位置(
    哪个java
    )。 将文件的权限更改为可执行:

    chmod +x /opt/location/my_jar.jar
    

    这可能是您的环境变量

    在执行脚本时,它是否与当前登录的用户一样工作

    如果是的话

    运行:

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

    更新了对Eddy 2013年2月24日评论的回复。

    我想给你一个关于crontab的速成班

  • 可以通过全局/etc/crontab或用户下的crontab-e(编辑特定用户的cron)或crontab-l(列表-为每个用户存储在/var/spool/cron中)设置crontab
  • 我看到您尝试每10分钟运行一次,这在/etc/crontab中很好

    我建议给出当前shell的整个类路径的原因是,大多数时候脚本都试图使用unix命令,而该命令不是crontab路径的一部分(位于/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
    

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

    它可能是您的环境变量

    在执行脚本时,它是否与当前登录的用户一样工作

    如果是的话

    运行:

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

    更新了对Eddy 2013年2月24日评论的回复。

    我想给你一个关于crontab的速成班

  • 可以通过全局/etc/crontab或用户下的crontab-e(编辑特定用户的cron)或crontab-l(列表-为每个用户存储在/var/spool/cron中)设置crontab
  • 我看到您尝试每10分钟运行一次,这在/etc/crontab中很好

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

    要调试路径问题,通常最好监视crontab正在执行任务的用户的邮箱,如下所示: 所以tail-100/var/spool/mail/root并查看任何消息
    [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