1. 程式人生 > >關於crontab自動執行shell指令碼出現的不能執行命令問題

關於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
<<EOF
--------------------------------- 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中:

[[email protected] 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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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

然後就搞定啦。

相關推薦

關於crontab自動執行shell指令碼出現的不能執行命令問題

上一篇部落格寫了一個shell指令碼,用來測試計算機硬體資訊、cpu、記憶體等資訊。今天把它扔進crontab裡面想定期執行,並儲存資料。結果出現了問題。。。先看shell指令碼:#!/bin/bash ​ #定義變數NOW,值為當前日期。格式:yyyymmdd NOW=`d

執行shell指令碼出現bad interpreter:No such file or directory錯誤

出現原因:在windows下編輯的指令碼,所以有可能有不可見字元。指令碼檔案是DOS格式的,即每一行的行尾以\r\n來標識, 其ASCII碼分別是0x0D, 0x0A. 解決方法,vim出問題的指令碼

sh執行shell指令碼出現語法錯誤

今天除錯一個指令碼,用./的方式直接執行指令碼沒有發現任何問題,但是當我用如下命令列印除錯資訊的時候就會發現各種問題: sh -x sample.sh 下面給出sample.sh #!/bin/bash hello(){     echo "Hello, this is

cygwin下執行shell指令碼出現的錯誤

想在空閒時間學習一下shell指令碼程式設計,由於不方便在公司,不方便在linux下執行,故選擇在cygwin下模擬。 而在cygwin下,並不比真正的linux,會出現各種奇葩的問題。 問題一: 用notepad++下編輯sh檔案,執行時出現  syntax erro

解決命令執行shell指令碼成功,但crontab執行失敗

命令列執行指令碼成,但crontab執行shell指令碼不成功是由於兩個原因導致 解決方法 1. 路徑問題 檢視crontab中執行該指令碼的路徑是否正確。例如: */1 * * * * cd /mypath/;./my_shell.sh > /d

shell指令碼使用ssh命令連線主機,自動建立目錄,分發程式,執行命令

=========shell呼叫ssh和ftp實現多主機自動管理功能=========== 自動登入多臺主機建立目錄自動向指定目錄下上傳指定檔案自動修改指定檔案內容 ===================================================

使用crontab定時執行shell指令碼

原帖地址:http://blog.chinaunix.net/uid-429659-id-4510419.html 使用crontab你可以在指定的時間執行一個shell指令碼或者一系列Linux命令。例如系統管理員安排一個備份任務使其每天都執行 入門 # cronta

linux中利用shell指令碼條件執行linux命令

linux中利用shell指令碼條件執行命令 在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的(以跳轉不

sh命令 /Linux中執行shell指令碼的4種方法總結

bash shell 指令碼的方法有多種,現在作個小結。假設我們編寫好的shell指令碼的檔名為hello.sh,檔案位置在/data/shell目錄中並已有執行許可權。 方法一:切換到shell指令碼所在的目錄(此時,稱為工作目錄)執行shell指令碼:此種方法為阿里雲推

linux的shell指令碼執行多個命令的方法

第一種是以分號(;)進行劃分:表示:各命令的執行的果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。 第二種命令之間&&隔開 表示:若前面的命令執

使用crontab,讓linux定時執行shell指令碼

使用crontab你可以在指定的時間執行一個shell指令碼或者一系列Linux命令。例如系統管理員安排一個備份任務使其每天都執行 入門 # crontab –e 這樣可以已編輯模式打開個人的crontab配置檔案,然後加入一下這行: 0 0 * * * /home

shell指令碼直接執行crontab結果不一樣

問題描述: 案例1. 以前寫了個更新svn然後cp到別外一個目錄(簡稱目錄a)的指令碼,達到另外一個目錄的程式定期svn同步的效果。(當然,你可能要問為啥目錄a不裝個svn up,這個你可以先不管) 指令碼寫好後,執行沒有問題,結果放到crontab中定時跑,卻怎麼也不行

linux crontab執行shell指令碼中包含相對路徑的問題

例項一 test.sh檔案 echo `date`>test.log 配置crontab 設定 */1 * * * * sh /data/test.sh 在/data/目錄下,未找到test.log檔案,重啟了crontab服務,service cronb rest

shell指令碼直接執行沒有問題,crontab定時執行失敗的解決方法

在實行一個shell指令碼(呼叫java程式修改一個excel檔案)時,單獨sh可以得到想要的結果。 但是放到crontab定時執行後,卻沒有得到一個新的excel檔案,log也沒有報錯。 查看了路徑,檔案許可權都沒有問題,最後在網上查了一下,發現這樣可以解決問題: 將cr

Linux執行shell指令碼方式及區別&命令後臺執行

假設shell指令碼檔案為hello.sh 放在/root目錄下。下面介紹幾種在終端執行shell指令碼的方法: [[email protected] home]# cd /root/ [[email protected] ~]#vim hello.s

centos crontab定時執行shell指令碼

1、安裝yum install crontabs2、建立指令碼touch test.sh3、編輯指令碼vi test.sh編輯後的test.sh還不是可執行檔案,需要執行chmod 700 test.sh4、編輯crontab -e                      

自動獲取shell指令碼的絕對路徑,執行路徑

檔名 test.sh #!/bin/sh echo "指令碼所在的資料夾名:" dirname $0 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo "指令碼的執行路徑

jenkin執行shell指令碼,找不到命令

jenkins預設是用非登入模式來執行shell命令,所有沒有載入環境變數配置檔案。 source /etc/profile 可以如下修改: 新增source /etc/profile

android應用程式執行shell指令碼命令

急問android應用程式如何執行shell指令碼命令 跪求大神指點~! 小菜在做一個android應用程式,需要執行系統呼叫命令,然後我考慮將命令寫在.sh腳本里,直接呼叫指令碼執行。 但是呼叫一直不成功。 我具體用到了如下行的函式呼叫,系統命令寫入了xxxxx.sh裡

linux中利用shell指令碼條件執行命令

在linux環境中,我們總會有一些命令需要經常用,例如經常跳轉到某些目錄下或者執行某些命令,輸入一連串的命令是很煩的,此時我們可以預先寫一些指令碼然後根據我們的選擇自動執行命令,那豈不是完美,本指令碼就是為此而生的(以跳轉不同的目錄舉例,當然也可以執行其他命令,