將一下指令碼,儲存為shell指令碼(collectinfo.sh)
#!/bin/bash
if echo $1 | grep -q '^[0-9]'
then
pid=`pidof %1`
else
pid=$1 #獲取程序pid
fiecho $pid
interval=5 #設定採集間隔
while true
do echo $(date +"%y-%m-%d %h:%m:%s") >> proc_ingfo.log
cat /proc/$pid/status|grep -e vmrss >> proc_ingfo.log #獲取記憶體占用
#cpu=`top -n 1 -p $pid|tail -3|head -1|awk ' '` #獲取cpu占用此方法無法在無終端中獲取到資料,換用如下方法
#echo "cpu: " $cpu >> proc_ingfo.log
cpu_core=$(grep -c processor /proc/cpuinfo)
total_time1=$(awk '}' /proc/stat)
cpu_time1=$(awk '' /proc/$pid/stat)
sleep 1
total_time2=$(awk '}' /proc/stat)
cpu_time2=$(awk '' /proc/$pid/stat)
#cpu_core=$((($cpu_time2 - $cpu_time1) / ($total_time2 - $total_time1)))
curr=$(($cpu_time2 - $cpu_time1))
total=$(($total_time2 - $total_time1))
cpu_core=$(( 100*$curr/$total))
echo "cpu: " $cpu_core " %" >> proc_memlog.txt
diskrb=`awk '/pgpgin/' /proc/vmstat`
sleep 1
diskre=`awk '/pgpgin/' /proc/vmstat`
diskr=$(($diskre-$diskrb))
echo "disk in: " $diskr >> proc_ingfo.log
diskrbs=`awk '/pgpgout/' /proc/vmstat`
sleep 1
diskres=`awk '/pgpgout/' /proc/vmstat`
diskrs=$(($diskres-$diskrbs))
echo "disk out: " $diskrs >> proc_ingfo.log
traffic_be=(`awk 'begin/enp136/' /proc/net/dev`)
sleep 1
traffic_af=(`awk 'begin/enp136/' /proc/net/dev`)
enp136_in=$((($-$)))
enp136_out=$((($-$)))
echo "enp136_in: " $enp136_in " kb">> proc_ingfo.log
echo "enp136_out: " $enp136_out " kb" >> proc_ingfo.log
echo $blank >> proc_ingfo.log
sleep $interval
done
***x 可以是程序id,也可是程式名稱
sh collectinfo.sh ***x
Shell指令碼通過引數傳遞呼叫指定函式
我們在寫一些功能性指令碼的時候,往往會把操作相似或者引數類似行為接近的函式放在同乙個shell指令碼中,這樣管理方便,維護簡單,也很清晰。對於這種情況,通常的辦法是,在shell指令碼中定義所有用到的函式,然後在正文 中用case語句讀入輸入的命令函式引數來呼叫指定的相應函式。這樣就達到乙個shel...
linux C程式中獲取shell指令碼輸出
本文使用docbook書寫,您可以在這裡獲得xml 檔案 abstract 本文描述了從linux程式中執行 shell 程式 指令碼 並獲得輸出結果的方法。table of contents 1.前言 2.使用臨時檔案 3.使用匿名管道 4.使用popen 5.小結 unix界有一句名言 一行sh...
linux c程式中獲取shell指令碼輸出
1.前言 unix界有一句名言 一行shell指令碼勝過萬行c程式 雖然這句話有些誇張,但不可否認的是,借助指令碼確實能夠極大的簡化一些程式設計工 作。比如實現乙個ping程式來測試網路的連通性,實現ping函式需要寫上200 300行 為什麼不能直接呼叫系統的ping命令呢?通常在程式 中通過 s...