近段时间使用crontab 定时执行shell脚本,来解析java项目日志,实现“日志解析”跟项目的业务逻辑解耦。编写shell脚本时却是挺顺利的,但在添加crontab定时执行shell脚本时,遇到了麻烦事。java
问题是这样的。个人shell脚本主要的代码是:(文件名为test.sh)shell
declare -i ibash
i=0ide
log_path=/home/testdata测试
cd $log_path命令行
nowdate=$(date +%Y%m%d%H)日志
for file in `ls -1| grep -v completed | grep -v $nowdate |grep login.`crontab
doit
file_list[$i]=$fileclass
i=`expr $i + 1`
echo ${file_list[$i-1]}
done
在命令行里执行/bin/bash test.sh ,能打印出筛选出的日志文件名。到这里感受应该问题不大了。因而设置crontab定时任务(每分钟执行一次):
*/1 * * * * bash /tmp/shell_tasks/test.sh > /tmp/testlog.log 2> &1
这个时候问题来了: crontab任务没有反应!!!典型的问题,单独执行shell脚本没有问题,放到crontab里就不行!!!
根据前辈们的经验,这分明就是crontab的环境跟bash的不同致使的。
给出解决方案有:
一、crontab命令里尽可能使用全路径:/bin/bash
*/1 * * * * /bin/bash /tmp/shell_tasks/test.sh > /tmp/testlog.log 2> &1
二、shell脚本里要直接引入环境变量:
首先是shell脚本开头添加这么一行:#!/bin/bash (注意,每一个字符之间都不要有空格)
这是在告诉系统,要用/bin/bash 的命令解释器来执行脚本。
其次是引入profile文件里的环境变量,即添加这么一行: source /etc/profile
最后就能够测试是否生效了。
后记: 在Linux里面,bash 和crontab 是两个不一样的程序,crontab没有去直接获取bash的环境变量,致使二者并不是必定能同时生效。