0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux计划任务crontab运行脚本不正确的问题

马哥Linux运维 来源:博客园薰衣草的旋律 2024-10-23 13:36 次阅读

问题的由来

写好的程序希望在崩溃之后能够自启动,于是利用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 */1* * * */home/watch.sh >/dev/null2>&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"即可)

一个小问题居然花了几个小时查清楚原因,可见平时觉得简单的问题在实际应用过程中还是有很多坑的

链接:https://www.cnblogs.com/wangqiguo/p/5399227.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209543
  • 程序
    +关注

    关注

    117

    文章

    3787

    浏览量

    81060
  • 脚本
    +关注

    关注

    1

    文章

    389

    浏览量

    14866

原文标题:Linux计划任务crontab运行脚本不正确的问题

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    linux的定时任务设置和crontab配置

    什么时候执行脚本/bin/sh /home/admin/jiaoben/buy/deleteFile.sh 这一字段可以设定你要执行的脚本,这里要注意一下bin/sh 是指运行脚本的命令后面一段时指
    发表于 07-08 06:20

    Linux应用--日志定时清理

    -rf {} \; 保存退出(:wq)。 (3)执行定时任务 #crontab -e进入定时任务编辑页面,按i底部出现INSERT,开始进行任务
    发表于 07-09 08:12

    详解linux定时任务

    定时执行程序,实现脚本中的功能,在linux是通过etc/init.d/crond这个服务来实现计划任务
    发表于 07-25 06:12

    stm32单步执行正常,全速运行结果不正确怎么解决

    关于stm32单步执行正常,全速运行结果不正确(时钟配置不正确)的问题现象,延时不正常,装载值与实际值不符。但是如果在时钟配置的部分在debug的情况下单步执行,那么一切正常,如果是全
    发表于 01-25 08:07

    Linux下自动运行crontab用法说明

    文件是对系统级任务的配置。语法说明以下是两个cron语句的例子(在 /etc/crontab 文件里)。前者用来晚间备份 /etc 目录,后者运行Analog程序处理服务器的统计信息。12 3
    发表于 04-02 14:32 250次阅读

    Linux任务调度crontab时间规则介绍

    到礼拜三的早上11点  0 11 4 * mon-wed date  #1月份日早上4点  0 4 1 jan * date  补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问
    发表于 04-02 14:33 281次阅读

    关于stm32单步执行正常,全速运行结果不正确(时钟配置不正确)的问题

    关于stm32单步执行正常,全速运行结果不正确(时钟配置不正确)的问题现象,延时不正常,装载值与实际值不符。但是如果在时钟配置的部分在debug的情况下单步执行,那么一切正常,如果是全
    发表于 11-30 15:36 11次下载
    关于stm32单步执行正常,全速<b class='flag-5'>运行</b>结果<b class='flag-5'>不正确</b>(时钟配置<b class='flag-5'>不正确</b>)的问题

    万用表读数不正确如何修复

    使用万用表在读取电压时,您可能会注意到,在一个已知的电压源上,万用表电压读数波动剧烈或不正确,这通常是内部保险丝熔断的迹象。这时需要测试保险丝是否导通,并根据用户手册推荐的保险丝更换。
    的头像 发表于 07-07 09:27 5680次阅读

    浅析Wireshark流量添加计划任务行为检测

    at命令是Windows自带的用于创建计划任务的命令,但是at命令只在2003及以下的版本使用。
    的头像 发表于 10-19 09:10 1071次阅读

    APM32F051C8T6_时钟_系统主频不正确

    APM32F051C8T6_时钟_系统主频不正确
    发表于 11-09 21:03 0次下载
    APM32F051C8T6_时钟_系统主频<b class='flag-5'>不正确</b>

    Crontab:简单实用的Python 周期任务调度工具

    如果你想周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点: 1.不方便执行 秒级
    的头像 发表于 11-01 09:40 745次阅读

    使用crontab定时执行脚本

    先介绍一下crontab: crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后
    的头像 发表于 11-03 15:49 588次阅读

    ie浏览器限制运行脚本

    IE浏览器限制运行脚本是指在Internet Explorer浏览器中,存在一些限制和安全策略,以保护用户的电脑免受恶意脚本的攻击。这些限制有助于防止在浏览器中执行恶意代码,保护用户的隐私和电脑
    的头像 发表于 11-26 11:19 1501次阅读

    linux定时任务的用法总结

    习惯了使用 windows 的计划任务,使用 linux 中的 crontab 管理定时任务时很不适应。
    的头像 发表于 08-14 18:16 851次阅读
    <b class='flag-5'>linux</b>定时<b class='flag-5'>任务</b>的用法总结

    Linux计划任务介绍

    1.计划任务(定时任务)基本概述 1.什么是crond crond就是计划任务,类似于我们平时生活中的闹钟。定点执行。 2.为什么要使用crond crond主要是做一些周期性的任务
    的头像 发表于 11-24 15:49 290次阅读