說明:很多時候通過Shell腳本去處理任務的時候,如果僅僅是單進程運行的話可能效率會比較低,所以本章將介紹Shell腳本多進程編程,進程的啟停以及進程ID管理
代碼版塊
<code>#!/bin/bash
basedir=$(cd `dirname "$0"`;pwd)
logdir=$basedir/logs
piddir=$basedir/pid
logfile=$logdir/log.log_$(date +%F)
pidfile=$piddir/mprocess.pid
number=30
#創建目錄
mkdir -p $logdir $piddir
#生成日誌
do_writelog() {
case $1 in
i|I)
shift
echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|INFO|$@" >>$logfile
;;
e|E)
shift
echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|ERROR|$@" >>$logfile
;;
w|W)
shift
echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|WARNING|$@" >>$logfile
;;
*)
echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|DEBUG|$@" >>$logfile
esac
}
case $1 in
start)
expr $2 + 0 &>/dev/null
if [ $? -ne 0 ];then
number=1
else
if [ $2 -le $number ];then
number=$2
fi
fi
seq $number|while read i;do
(
while true;do
do_writelog i "Thread-$i|多進程測試"
sleep 0.5
done
)&
echo "$!" >>$pidfile
done
;;
stop)
expr $2 + 0 &>/dev/null
if [ $? -ne 0 ];then
number=1
else
if [ $2 -le $number ];then
number=$2
fi
fi
if test -e "$pidfile";then
head -n $number $pidfile|xargs kill -9 &>/dev/null
if [ $number -lt $(cat $pidfile|wc -l) ];then
sed -i "1,${number}d" $pidfile
else
rm -f $pidfile &>/dev/null
fi
else
echo "進程PID文件($pidfile)不存在,服務未啟動"
fi
;;
*)
echo "USAGE: sh $0 start|stop"
esac
/<code>
使用方法
1、啟動多進程:
sh mprocess.sh start 進程數
再次啟動3個進程,可以看到進程數已經變成8個了
2、停止多進程:
sh mprocess.sh stop 進程數
繼續停止進程,直至停止所有進程
至此多進程測試已經完成,該測試比較簡單可以按照此方法套路出其它功能腳本
閱讀更多 運維之道中道 的文章