crontab定时任务及jar包等问题

时间:2022-10-11 08:09:27

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定时导出数据库数据的任务啦。