定时任务的路径问题

发布时间 2023-03-26 16:52:52作者: 永恒&

定时任务的路径问题

背景

设置一个cron定时任务,定时执行一个sh脚本,脚本执行一个jar包中的程序,发现jar包的日志输出路径错误。记录一下

cron定时任务

crontab -e # 编辑当前用户的定时任务
*/1 * * * * /xxx/xxx/test.sh # 设置为1分钟执行一次,这个路径的脚本。保存修改并退出。该脚本需要提前提升为可执行权限。

# 通过如下命令查看是否执行成功
cat /var/logs/corn # 通过这个命令可以看到是否执行了

结果发现,定时任务调用脚本执行了,但是脚本调用jar包,执行失败了。

通过网上搜索,发现失败原因如下:

  • 当以root账户设置cron定时任务时,默认的执行路径是在/root下。如果是其他用户,则在/用户目录下。
  • 脚本中都是以相对路径,写的 java -jar xxx.jar 所以,找不到 java 和 jar 包
  • javaxxx.jar 换成绝对路径,jar包成功执行

但是,jar包中的日志信息,并输出到 /root/logs/ 目录下,现在想让jar包的日志信息输出到, /xxx/jarPath/logs 目录下,只需要在脚本中加入 cd /xxx/jarPath.

总结

cron定时任务执行的默认路径是/用户目录,所以在脚本中最好使用绝对路径,并且加入 cd /xxx/jarPath/.

cron定时命令的格式

# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
定时任务的每段为:分,时,日,月,周,用户,命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,
/5 * * * * cmd,每隔五分钟执行一次