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
不太清楚这是为什么?

脚本加入:
#!/bin/bash
crontab 执行时:sh --> /usr/bin/bash or bash
问题依旧
bash与sh根本区别在于:都是脚本语言,但bash是sh的超集,有更多的功能,这个地方sh不支撑for,但bash支持。所以通过使用bash是可以解决上述问题的。


在xxxx.sh中加入
echo $PATH
output:
/usr/bin
whereis ip
output:
/usr/sbin
echo $PATH
output:
/usr/bin:/usr/sbin/……
结论:环境变量的问题导致的;因为在crontab中PATH只有/usr/bin而ip命令是在/usr/sbin目录下;所以需要在crontab中加入/user/sbin才行;
export PATH=$PATH:/usr/sbin
如图所示:

输出结果就正常了:

这方法是有效的
ip addr --> /usr/sbin/ip addr
ip addr --> ipaddr #因为ipaddr命令是在/usr/bin目录下的
1、本质是因为环境变量的问题导致的,因为crontab中PATH值个数远小于linux中PATH。
2、变量执行都是需要在linux中环境路径下寻找的。(如果意识到这个问题,可能就会快速定位到环境变量问题)
1与2综合得出:很多变量是无法在crontab在执行的,所以手动可以执行成功的
3、bash与sh的区别:它们可以理解为一种脚本语言,但bash功能比sh要丰富很多,与命令无法被找到是没有关系的;但也会出现如果用sh执行,会bash的某些函数是无法执行的,令crontab失效。
4、最好的方法是加入环境变量,从根本上解决问题