Linux计划任务crontab运行脚本不正确的问题
问题的由来
写好的程序希望在崩溃之后能够自启动,于是利用linux的crontab功能,添加一个计划任务,每分钟执行一个脚本查看需要监控的进程是否还在,如果不在则启动之,否则不做任何事情。这么一个简单的脚本在crontab中运行和在shell终端手工运行的结果却不一样。
问题描述
以下是监控脚本/home/watch.sh的内容:
#!/bin/sh
shell_log_file=/home/start.log
pid_count=`pidof video_checkup | wc -w`
path=$(cd "$(dirname "$0")"; pwd)
run_command="${path}/video_checkup"
config_path="${path}/config.json"
if [ $pid_count -eq 0 ]; then
echo `date +%Y-%m-%d_%H:%M:%S`" run $run_command $config_path" >> $shell_log_file
$run_command $config_path
else
echo `date +%Y-%m-%d_%H:%M:%S`" video_checkup already running" >> $shell_log_file
fi
在shell终端中执行crontab -e 命令添加如下语句:
*/1 * * * * /home/watch.sh >/dev/null 2>&1
表示该脚本每分钟运行一次,脚本的逻辑很简单就是检查进程video_checkup如不存在则运行之,可是在实际测试中却发现,video_checkup进程不断增多,每分钟都被运行了一次。
问题分析
通过调试发现脚本中 if [ $pid_count -eq 0 ]; then
每次都会进入并执行video_checkup程序,也就是说 $pid_count -eq 0
这个判断每次都是true。将 $pid_count 的值导入到log文件中发现确实是0 。
但是video_checkup明明在运行的啊,不可能是0的,将watch.sh在shell命令行上手工执行却是正常的结果($pid_count就是实际的正在运行的video_checkup进程个数的值)。经过google发现,在crontab计划任务中执行脚本watch.sh的环境变量,和自己ssh登录到shell中手工执行watch.sh的环境变量是不同的,于是乎在watch.sh中加入下面的语句:
echo `export` >> $shell_log_file
并分别在crontab中执行watch.sh,以及在ssh登录的shell中手工执行watch.sh发现果然export的结果不一样。
在crontab中执行watch.sh的时候log文件中显示的export结果中PATH的值是: export PATH="/usr/bin:/bin"
而ssh登录到shell之后手工执行watch.sh之后log文件中显示的export结果中的PATH的值是: PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
这个影响大吗,难道这个PATH变量对 pid_count=`pidof video_checkup | wc -w`
执行的结果会有影响?
此时我想到有一种可能就是,pidof命令是在哪个目录下? 在ssh的shell环境中执行:
[root@172-28-246-152 video_checkup]# which pidof
/sbin/pidof
发现pidof命令是在 /sbin/目录下,也就是说crontab运行的环境中 PATH="/usr/bin:/bin" 目录中根本没有pidof这个命令,那么在crontab中执行 watch.sh中的 pid_count=`pidof video_checkup | wc -w`
就会失败,但是居然连一个错误都没有报告,而且pid_count变量中还被赋值了,难道pidof命令找不到的时候这个语句也能返回值?
我在ssh的shell中构造一个不存在的pidof路径,试一下:
[root@172-28-246-152 video_checkup]# pid_count=`/xx/pidof video_checkup | wc -w`
-bash: /xx/pidof: No such file or directory
果然报错说No such file or directory找不到命令,但是此时pid_count中是否有值呢? 再试一下:
[root@172-28-246-152 video_checkup]# pid_count=`/xx/pidof video_checkup | wc -w` && echo $pid_count
-bash: /xx/pidof: No such file or directory
0
结果彻底清楚了: 由于crontab在后台运行,所以pidof命令不存在,我们根本看不到报错信息,因为报命令不存在的信息是不会被通过管道传递给 wc -w 的,所以可以说出错的时候wc -w没有收到任何输入,但是其执行的结果却是 0 那么变量pid_count的值就是 0 了。
问题解决
将ssh登录之后的shell环境中的PATH赋值到watch.sh脚本中即可,这样脚本在运行的时候就可以正确找到 pidof 命令得出正确的结果了 (也即在脚本watch.sh的开始处加入代码 PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
即可)
一个小问题居然花了几个小时查清楚原因,可见平时觉得简单的问题在实际应用过程中还是有很多坑的
Linux计划任务crontab运行脚本不正确的问题的更多相关文章
- Linux计划任务Crontab实例详解教程
说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS ...
- linux计划任务crontab的使用
参考网站:https://www.cnblogs.com/intval/p/5763929.html 编辑计划任务: crontab -e 查看计划任务: crontab -l 使用实例: ...
- Linux 计划任务 Crontab 笔记与总结(2)Crontab 的基本组成与配置
[Crontab 的基本组成] ① 系统服务 CROND:每分钟都会从配置文件刷新定时任务 ② 配置文件 :文件方式设置定时任务 ③ 配置工具 crontab:用途调整定时任务 [配置文件的配置文件格 ...
- Linux简单检查服务运行脚本
脚本内容如下: 此脚本含义:检查服务是否运行,在运行则记录日志,不在运行则记录日志并将服务启动 #!/bin/bash svrnm="tomcat" //设置服务名称time=`d ...
- Linux 计划任务 Crontab 笔记与总结(5)crontab 常见错误与案例
① 环境变量 cd ~ pwd 就会到你登陆的那个用户的根目录下 ls -a 能够查看到 .bash_profile 这个文件 vim .bash_profile 这里面设置了一些环境变量. 可以设置 ...
- linux 计划任务(crontab)
每天写一点,总有一天我这条咸鱼能变得更咸 cron服务是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业.频率可以划分为 分钟 小时 天 月 周,格式如下: 1.crontab 服 ...
- Linux计划任务crontab
Linux系统中存在两种工作调度的方式 周期性的(at),每隔一个固定的周期要来办的事项: 一次性的(crontab),做完一次以后就不会再执行: at at是个可以处理仅执行一次就结束调度的指令,不 ...
- Linux学习笔记之Linux计划任务Crontab
0x00 cron 简介 cron 是 UNIX, SOLARIS,LINUX 下的一个十分有用的工具.通过 cron 脚本能使计划任务定期地在系统后台自动运行. 0x01 cron 命令 cront ...
- Linux 计划任务 Crontab 笔记与总结(3)Crontab 配置文件
[全局(系统)配置文件] /etc/crontab Linux 主要的配置文件都在 etc 目录下. cd /etc ls cron* vim crontab 进入 cron.d(服务) cd cro ...
随机推荐
- 借助无线路由器+2台笔记本+Windows桥接功能,成功绕过了微信聊天记录迁移的BUG
最近入了台iphone se,在迁移微信聊天记录的时候,遇到个BUG.它的迁移流程是这样的:需要将两台手机连接到同一个WIFI上面,然后新手机扫旧手机上面的二维码,来完成导入.中途遇到的问题是: 此时 ...
- Git之VS2010实践
对于我们经常在VS2010下编程的开发人员来说,强大的SCM工具Git貌似对我们很陌生.对于Git,我在我的另一篇博客<Git学习笔记>中已做过介绍,下面我再简单介绍一下Git在VS201 ...
- Asp.Net MVC4入门指南(10):第三方控件Studio for ASP.NET Wijmo MVC4 工具应用
ComponentOne Studio for ASP.NET Wijmo最新版本2013V1支持MVC4,其中包括: 新增 MVC 4 工程模板 (C# & VB) 开箱即用的MVC 4 工 ...
- checkbox全选
jquery代码如下(在jquery1.10.2下验证通过): <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...
- Trie 最长前缀匹配串的实现
http://blog.csdn.net/hguisu/article/details/8131559
- putpixel
from PIL import Imageimg = Image.open("D:\Python27\ggg.gif")(w,h) = img.sizeim=img.convert ...
- 1074. Reversing Linked List (25)
模拟题,注意当k == 1 与 k == n时情况 #include <stdio.h> #include <string.h> #include <iostream&g ...
- 【Mail】telnet收发邮件过程
telnet发送邮件 关于电子邮件的基础知识请参照:[Mail]邮件的基础知识和原理 smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协 ...
- (Python)继承
面向对象的另一个特性是继承,继承可以更好的代码重用. 例如一个学校里面的成员有老师.学生.老师和学生都有共同的属性名字和年纪.但老师还有它自己的属性,如工资.学生也有它的属性,如成绩. 因此我们可以设 ...
- HTML5+CSS3学习笔记(二) 页面布局:HTML5新元素及其特性
HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. 本次学习HTML5的新标签元素有: <head ...