关于crontab自动执行shell脚本出现的不能执行命令问题

上一篇博客写了一个shell脚本,用来测试计算机硬件信息、cpu、内存等信息。今天把它扔进crontab里面想定期执行,并保存数据。结果出现了问题。。。

先看shell脚本:


#!/bin/bash

#定义变量NOW,值为当前日期。格式:yyyymmdd
NOW=`date +%Y-%m-%d-%H:%M:%S`
#定义变量OUTPUT
OUTPUT=/mnt/log/$NOW.txt

exec 3>&1
#在文件描述符3上打开变量OUTPUT文件,用于写入
exec >$OUTPUT
echo "The Information $NOW collect as:"
cat <
    ---------------------------------
    System Info run @ $(date) for $(hostname)
    ---------------------------------
EOF

cat <<-EOF
    ********************************
    ******Installed Hard Disk*******
    ********************************
EOF
#显示系统中已经安装的磁盘
fdisk -l |egrep "^Disk /dev"
echo ----------------------------------------------
echo

cat <<-EOF
    ********************************
    **File System Disk Space Usage**
    ********************************
EOF
#显示文件系统磁盘使用情况
df -H
echo ----------------------------------------------
echo

cat <<-EOF
    ********************************
    ********Cpu Information*********
    ********************************
EOF
#显示cpu类型
grep 'model name' /proc/cpuinfo | uniq | awk -F: '{ print $2 }'
echo ----------------------------------------------
echo


cat <<-EOF
    ********************************
    *****Operating System Info******
    ********************************
EOF
#显示系统信息
uname -a 
echo ----------------------------------------------
echo

release=/usr/bin/lsb_release
#如果文件/usr/bin/lsb_release存在并且可执行,则打印系统发行版本所有信息,否则提示文件不存在
[ -x $release ] && $release -a || echo " file $release does not exist!"

cat <<-EOF
    ********************************
    *Amount Of Free And Used Memory*
    ********************************
EOF
#显示剩余内存和使用的内存
free -m
echo ----------------------------------------------
echo

cat <<-EOF
    ********************************
    **Top 10 Memory Eating Process**
    ********************************
EOF
#显示最消耗内存的10个进程
ps -auxf | sort -nr -k 4 | head -10
echo ----------------------------------------------
echo

cat <<-EOF
    ********************************
    ***Top 10 CPU Eating Process****
    ********************************
EOF
#显示最消耗cpu的10个进程
ps -auxf | sort -nr -k 3 |head -10
echo ----------------------------------------------
echo

cat <<-EOF
    *************************************
    **Network Device Information [eth0]**
    *************************************
EOF
#显示第一块网卡的信息
netstat -i | grep -q eth0 && ifconfig eth0 || echo "eth0 is not installed"
echo ----------------------------------------------
echo

cat <<-EOF
    *************************************
    *******Wireless Devicce [wlan0]******
    *************************************
EOF
#显示无限网卡信息,如果不存在提示
netstat -i | grep -q wlan0 && ifconfig wlan0 || echo "wlan0 is not installed"
echo ----------------------------------------------
echo

cat <<-EOF
    *************************************
    *****All Network Interfaces Stats****
    *************************************
EOF
#显示所有网卡的状态
netstat -i
echo ----------------------------------------------
echo

exec 1>&3 3>&-

echo "System info wrote to $OUTPUT file"

扔进crontab中:

[root@rs1 exec]# crontab -e
添加内容:
*/1 * * * *     /usr/bin/bash /mnt/exec/test/exec.sh

重点来了:美滋滋的等待在/mnt/log/下出现想要的文件,出现是出现了,然后出现了问题。

重点看生成的文本里面有问题的地方:

******Installed Hard Disk*******
********************************
----------------------------------------------

*************************************
**Network Device Information [eth0]**
*************************************
eth0 is not installed
----------------------------------------------

*************************************
*******Wireless Devicce [wlan0]******
*************************************
wlan0 is not installed
----------------------------------------------

实测,应该不是这样子的,毕竟手动执行bash exec.sh时,会出现东西的。


********************************
******Installed Hard Disk*******
********************************
Disk /dev/vda: 6442 MB, 6442450944 bytes, 12582912 sectors
Disk /dev/mapper/rhel-root: 5268 MB, 5268045824 bytes, 10289152 sectors
Disk /dev/mapper/rhel-swap: 645 MB, 645922816 bytes, 1261568 sectors
----------------------------------------------
*************************************
**Network Device Information [eth0]**
*************************************
eth0: flags=4163  mtu 1500
        inet 172.25.254.15  netmask 255.255.0.0  broadcast 172.25.255.255
        inet6 fe80::5054:ff:feb1:f80  prefixlen 64  scopeid 0x20
        ether 52:54:00:b1:0f:80  txqueuelen 1000  (Ethernet)
        RX packets 14702  bytes 1482880 (1.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6655  bytes 1175614 (1.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

----------------------------------------------

*************************************
*******Wireless Devicce [wlan0]******
*************************************
wlan0 is not installed
----------------------------------------------

所以,是什么原因让crontab把我的fdisk、ifconfig命令忽视了呢?

原来:

是因为 crontab 的 环境的问题,在crontab自动执行时,它不会加载PATH全部路径,我们必须在脚本里面声明出来。所以添加如下代码在shell脚本中。


PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

然后就搞定啦。

你可能感兴趣的:(shell)