• crontab定时任务及jar包等问题


    crontab是linux系统中定时执行任务的一个东东。例如我要定时导出数据库数据,每次手动导出会浪费很多时间,用此工具可以自动定时导出。

    1. 在任意文件夹下,例如usr/local下新建一个文件下test,把要执行的java程序打包成jar包放进去,打jar包的时候注意配置MANIFEST,要有main函数入口;

    2.新建一个.sh文件,例如run.sh,脚本内容类似如下:

     #!/bin/bash 
     cd /usr/local/
     /usr/java/jdk1.5/bin/java -jar auto.jar -cp /usr/java/jdk1.5/lib/tools.jar:/usr/java/jdk1.5/lib/dt.jar:/usr/local/classes12.jar

    注意此处路径要按照自己机器jdk实际路径写,写完后可以./run.sh先测试下脚本是否能正常运行;

    3. 使用crontab -e打开你的定时文件(crontab -l是查看当前的定时任务),文件内容如下:

    # Edit this file to introduce tasks to be run by cron.
    #
    # Each task to run has to be defined through a single line
    # indicating with different fields when the task will be run
    # and what command to run for the task
    #
    # To define the time you can provide concrete values for
    # minute (m), hour (h), day of month (dom), month (mon),
    # and day of week (dow) or use '*' in these fields (for 'any').#
    # Notice that tasks will be started based on the cron's system
    # daemon's notion of time and timezones.
    #
    # Output of the crontab jobs (including errors) is sent through
    # email to the user the crontab file belongs to (unless redirected).
    #
    # For example, you can run a backup of all your user accounts
    # at 5 a.m every week with:
    # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

    默认是nano编辑器,当然也可以自定义,

    比如我们要在每天的9:30执行任务,就在尾部添加:

    30 9 * * * /usr/local/test/run.sh > /tmp/run.log 2>&1&

    输出的log就在/tmp下的run.log里了,

    前5个由空格隔开的小东东,分别表示分、时、天、月、星期,具体用法网上一查就有。

    *******************************************************************************************************************************

    如果按照上面的步骤进行很有可能无法正常运行,啊和哈哈哈哈,本人也是花费了一下午时间找出原因了。

    导出的jar包一直有问题,直接java -jar auto.jar执行都会出错,原因有如下:

    1. 使用eclipse导出jar包的时候一个要添加MANIFEST配置程序入口;

    2. 但是相应的问题来了,你已经打包成jar包了,但是这个jar包中还引用了第三方jar包,直接这样运行是不行地;

    3. 所以在导出的最后一步,要选择 Use exiting manifest from workspace,然后导出自定义的MANIFEST.MF;

    4. MANIFEST.MF文件类似如下:

    Manifest-Version: 1.0
    Main-Class: com.test.main

    我们在第三行追加Class-Path: 

    然后把第三方jar包添加上去,类似Class-Path: email.jar ajax.jar 多个jar包之间用空格隔开

    注意Main-Class:和com.test.main之间是有个空格的,其他行类似;

    5. 当我兴冲冲的准备打jar包的时候发现根本无法打jar包,要么提示line too long 要么就是invalid header field什么来着,这儿需要做很蛋疼的一个排版,

    当第三方jar包过多的时候,每行最多72个字符,多了的话就会提示line too long,当你天真的用回车一行行变短后,打jar包就会发现出来invalid header field什么错误,

    蛋疼的是每次回车后要追加两个空格,然后最后一行要输入回车;

    6. 当第三方jar多的超出你的忍耐力的时候,千万别傻乎乎的一行行的手动输入,短短几行代码帮你解决:

    xueyw@ubuntu:/usr/local/lib$ export libs=""; for l in *.jar; do export libs="$libs $l"; done

    xueyw@ubuntu:/usr/local/lib$ echo $libs

    这样就空格打印出所有的第三方jar包了,拿去复制即可!

    所有以上执行完后,

    千万别忘了重启cron服务

    service cron restart

    恭喜自己,终于能实现我那用crontab定时导出数据库数据的任务啦。

  • 相关阅读:
    问题详情-手机问问
    红萝卜要不要削皮?
    清炖香菇
    如何清洗新鲜的香菇
    青菜粥的做法
    Qt移动版优化后台云服务、支持跨平台开发
    EF架构~EF异步改造之路~仓储接口的改造~续
    EF架构~EF6配置需要注意的几个地方
    EF架构~EF异步改造之路~让DbContextRepository去实现异步接口
    EF架构~EF异步改造之路~仓储接口的改造
  • 原文地址:https://www.cnblogs.com/xue2b/p/3327083.html
Copyright © 2020-2023  润新知