1 有个项目上使用的是centos 6.7的环境,然后需要定时杀死一个程序的进程,这个程序有守护进程,杀死它会自动起来,然后我做了一个脚本并加入到定时任务中,最后发现是没有成功执行!
但是手动执行脚本非常好.................. 这个问题困惑了一个上午,最后定位到原因
原因是 crond 定时程序的所开的环境变量和脚本的所使用的环境变量不一样造成的,做如下记录
crontab 的环境变量中的PATH 是 PATH=/usr/bin:/bin
获取crontab 环境变量的方法如下 参考:关于Linux下的crontab,你不知道的那些知识点 - 知乎
*/1 * * * * /usr/bin/env > /tmp/env.txt
cat /tmp/env.txt
但是我要使用pidof 这个命令,这个命令是/sbin/pidof 是/sbin中的
显然cron执行时会开一个shell,这个环境变量中没有/sbin,所以造成这个情况
找到问题是这样的方法
[root@dahuatech opt]# cat /var/spool/cron/root
*/1 * * * * sh -x /opt/restartDMS.sh >> /opt/b.txt 2>&1
# 每分钟执行一下我写的脚本,并把整个过程中的错误和正确输出都重定向到一个文件好查看原因
# 查看b.txt后发现报
########################报错########################
[root@dahuatech opt]# cat b.txt
++ pidof /opt/abc/EEE/DMS
/opt/restartDMS.sh: line 2: pidof: command not found
+ p=
+ sleep 1
+ kill -9
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
发现定义的变量都没有获取到值 那也就是pidof 没有正常运行,报错中也有提示 command not found
发现这个原因后就直接在脚本中把命令的完整路径都写下来就可以了
[root@dahuatech opt]# cat /opt/restartDMS.sh
#! /bin/bash
p=`/sbin/pidof /opt/DDD/EEE/DMS`
sleep 1
kill -9 $p
#################### 下面是定时任务####################
[root@dahuatech opt]# crontab -l
30 2 * * * /opt/mysql/bin/db_backup_job.sh
0 3 * * * /usr/local/bin/ftp_upload.sh
1 1 * * * sh -x /opt/restartDMS.sh #每天凌晨1点1分执行脚本