• linux crontab: ip: command not found


    一、问题来源:

    1、xxxx.sh中会执行某个py文件,这个py文件会执行os.popen(‘ip addr show eth0’).read().split(“inet “)[1].split(”/”)[0];

    2、手动执行某个脚本:sh xxxx.sh;一切正常;

    3、将这个脚本加入crontab中去执行会出现报错;/bin/sh ip command not found

    不太清楚这是为什么?

    二、问题探究:

    1、bash取代sh,参考如下方法:

    在这里插入图片描述

    脚本加入:
    #!/bin/bash
    crontab 执行时:sh --> /usr/bin/bash or bash
    问题依旧

    bash与sh根本区别在于:都是脚本语言,但bash是sh的超集,有更多的功能,这个地方sh不支撑for,但bash支持。所以通过使用bash是可以解决上述问题的。
    在这里插入图片描述
    在这里插入图片描述

    方法二、加入环境变量:

    1、根因定位:

    在xxxx.sh中加入

    echo $PATH
    output:
    /usr/bin
    
    • 1
    • 2
    • 3
    whereis ip
    output:
    /usr/sbin
    
    echo $PATH
    output:
    /usr/bin:/usr/sbin/……
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结论:环境变量的问题导致的;因为在crontab中PATH只有/usr/bin而ip命令是在/usr/sbin目录下;所以需要在crontab中加入/user/sbin才行;

    2、解决方案:
    export PATH=$PATH:/usr/sbin
    
    • 1

    如图所示:
    在这里插入图片描述
    输出结果就正常了:
    在这里插入图片描述
    这方法是有效的

    方法三、

    1、绝对路径执行命令

    ip addr --> /usr/sbin/ip addr
    
    • 1

    方法四、

    1、替换执行命令

    ip addr --> ipaddr #因为ipaddr命令是在/usr/bin目录下的
    
    • 1

    三、结论:

    1、本质是因为环境变量的问题导致的,因为crontab中PATH值个数远小于linux中PATH。
    2、变量执行都是需要在linux中环境路径下寻找的。(如果意识到这个问题,可能就会快速定位到环境变量问题)
    1与2综合得出:很多变量是无法在crontab在执行的,所以手动可以执行成功的

    3、bash与sh的区别:它们可以理解为一种脚本语言,但bash功能比sh要丰富很多,与命令无法被找到是没有关系的;但也会出现如果用sh执行,会bash的某些函数是无法执行的,令crontab失效。
    4、最好的方法是加入环境变量,从根本上解决问题

  • 相关阅读:
    基础1:JS的原型和原型链究竟是什么
    Glide 源码解析与原理总结——Glide.with
    selenium安装和python中基本使用
    计算机考研C语言题库
    icpc刷题记录
    MyBatis学习:使用Map的方法传递参数
    微信小程序:实现音乐播放器的功能
    如何在低代码表单或列表页面中创建OA审批流程?
    如何阅读论文?
    最高分辨率,阜时全固态激光雷达SPAD芯片FL6031技术全解析
  • 原文地址:https://blog.csdn.net/ningyanggege/article/details/127420870