今天看到一个shell脚本玩多进程的例子,觉得很有趣扩展一下代码。
#!/bin/bash
Number="1000";
Thread="10";
Timeout="1";
PATH="${PATH}:/sbin:/usr/sbin";
function RunCmd()
{
echo "User Cmd"
}
function LockFile()
{
find /dev/shm/* -maxdepth 0 -type l -follow -exec unlink {} \;
[ -f /dev/shm/${0##*/} ] && { echo "$0 is run !";exit 1; }
ln -s /proc/$$ /dev/shm/${0##*/}
trap "Exit" 0 1 2 3 15 22 24
}
function Exit()
{
unlink /dev/shm/${0##*/};
ps -eo "%p %P %c"|awk '{if($2==1 && $3~/'${0##*/}'/)system("kill -9 "$1)}'
exec 4<&-;
rm -f ${PID}
exit 0;
}
# main ()
LockFile
PID="$$";
cd /dev/shm/;exec 2>/dev/null
typeset i;
( while true;do
sleep $((${Timeout}+3));
ps -eo "%p %P %t"|awk '{if($2=='${PID}')
{
split($3,ST,"[^0-9]");
L=length(ST);
S=0;
if(L==4){ S=ST[1]*86400;ST[1]=0 }
for(a=L;a>0;a--) S=S+(ST[a]*(60**(L-a)));
if(S>'${Timeout}') { system("kill -9 "$1" && echo N >'${PID}'")}
}}'
done & >/dev/null 2>&1 )
mknod ${PID} p ;exec 4<>${PID}
for((i=0;i<Thread;i++));do echo "OK" >&4;done
for((i=0;i<Number;i++));do
read;
( RunCmd; echo "OK" >&4 ) &
done <&4
wait
|
阅读(1455) | 评论(0) | 转发(0) |