目录
- 写在前面
- 所需知识
- 问题复现
- 解决方式
- 方法1. 使用绝对路径的命令:
- 方法2. 重新加载环境变量:
- 成功解决截图
- 原理
写在前面
定时任务脚本出现command not found报错,解决方案。
所需知识
- 定时任务
- shell脚本
- 环境变量
问题复现
编写了一个很简单的脚本,查看一下网卡信息。
[root@ecm-98ce ~]# cat ipif.sh
ip a s eth0
echo "---"
ifconfig eth0
但是将这个脚本放到crontab
下执行,就报错了
#crontab
[root@ecm-98ce ~]# crontab -e
crontab: installing new crontab
[root@ecm-98ce ~]# crontab -l
#4. show nic info and save in file
* * * * * /bin/sh /root/ipif.sh &>> /tmp/ipif.info
#报错
[root@ecm-98ce ~]# tail /tmp/ipif.info
/root/exercise/day26/ipif.sh: line 1: ip: command not found
---
/root/exercise/day26/ipif.sh: line 3: ifconfig: command not found
解决方式
方法1. 使用绝对路径的命令:
which ip ifconfig
/usr/sbin/ip
/usr/sbin/ifconfig
[root@ecm-98ce ~]# cat ipif.sh
/usr/sbin/ip a s eth0
echo "---"
/usr/sbin/ifconfig eth0
方法2. 重新加载环境变量:
#1 重写定义环境变量PATH
```shell
[root@ecm-98ce ~]# cat ipif.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin #添加这行
ip a s eth0
echo "---"
ifconfig eth0
#2 重新加载环境变量
[root@ecm-98ce ~]# cat ipif.sh
#!/bin/bash
source /etc/profile #添加这行
ip a s eth0
echo "---"
ifconfig eth0
成功解决截图
原理
- 在定时任务运行命令或脚本的时候,只能识别到/bin或/usr/bin目录下面的命令
- 只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量
- 有部分命令存在在/sbin上的命令,crontab无法默认使用,所以需要
使用绝对路径
或重写PATH变量
或重新加载环境变量
环境变量中的路径变量PATH
它告诉系统在哪些目录下查找可执行文件的路径,实现可以使用相对路径的命令
。
如ls
,系统将自动在PATH中的路径进行查找,查找到/usr/bin/ls
后执行
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin