需求:并发检测1000台web服务器状态(或者并发为1000台web服务器分发文件等)如何用shell实现?
方案一:(这应该是大多数人都第一时间想到的方法吧)
思路:一个for循环1000次,顺序执行1000次任务。
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/bin/bash
start_time=`
date
+%s`
#定义脚本运行的开始时间
for
((i=1;i<=1000;i++))
do
sleep
1
#sleep 1用来模仿执行一条命令需要花费的时间(可以用真实命令来代替)
echo
'success'
$i;
done
stop_time=`
date
+%s`
#定义脚本运行的结束时间
echo
"TIME:`expr $stop_time - $start_time`"
|
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@iZ94yyzmpgvZ ~]
# . test.sh
success1
success2
success3
success4
success5
success6
success7
........此处省略
success999
success1000
TIME:1000
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/bin/bash
start=`
date
+%s`
#定义脚本运行的开始时间
for
((i=1;i<=1000;i++))
do
{
sleep
1
#sleep 1用来模仿执行一条命令需要花费的时间(可以用真实命令来代替)
echo
'success'
$i;
}&
#用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行
#一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了
#循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理
#这些任务
done
wait
#wait命令的意思是,等待(wait命令)上面的命令(放入后台的)都执行完毕了再
#往下执行。
#在这里写wait是因为,一条命令一旦被放入后台后,这条任务就交给了操作系统
#shell脚本会继续往下运行(也就是说:shell脚本里面一旦碰到&符号就只管把它
#前面的命令放入后台就算完成任务了,具体执行交给操作系统去做,脚本会继续
#往下执行),所以要在这个位置加上wait命令,等待操作系统执行完所有后台命令
end=`
date
+%s`
#定义脚本运行的结束时间
echo
"TIME:`expr $end - $start`"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@iZ94yyzmpgvZ /]
# . test1.sh
......
[989] Done {
sleep
1;
echo
'success'
$i; }
[990] Done {
sleep
1;
echo
'success'
$i; }
success992
[991] Done {
sleep
1;
echo
'success'
$i; }
[992] Done {
sleep
1;
echo
'success'
$i; }
success993
[993] Done {
sleep
1;
echo
'success'
$i; }
success994
success995
[994] Done {
sleep
1;
echo
'success'
$i; }
success996
[995] Done {
sleep
1;
echo
'success'
$i; }
[996] Done {
sleep
1;
echo
'success'
$i; }
success997
success998
[997] Done {
sleep
1;
echo
'success'
$i; }
success999
[998] Done {
sleep
1;
echo
'success'
$i; }
[999]- Done {
sleep
1;
echo
'success'
$i; }
success1000
[1000]+ Done {
sleep
1;
echo
'success'
$i; }
TIME:2
|