Chinaunix首页 | 论坛 | 博客
  • 博客访问: 969837
  • 博文数量: 99
  • 博客积分: 3306
  • 博客等级: 中校
  • 技术积分: 1238
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-21 10:14
文章分类

全部博文(99)

文章存档

2012年(37)

2011年(56)

2010年(6)

分类: LINUX

2011-11-05 23:28:15

有时需要同时扫描几千个服务器,所有需要在shell中并发操作。虽然perl里可以很方便地对fork出来的进程做好
控制,但是有时就是一个小任务,所以直接就shell搞定了。

  1. #!/bin/bash
  2. fun(){
  3.     echo "hello i am $1. $(date '+%T')"
  4.     sleep 1
  5. }
  6. i=0
  7. PIDS=''
  8. while read job
  9. do
  10.     fun $job &
  11.     PIDS="$PIDS $!"
  12.     i=$((i+1))
  13.     if [ $i -ge 4 ];then
  14.         wait $PIDS
  15.         echo "finish jobs:$PIDS || $(date '+%T')"
  16.         PIDS=''
  17.         i=0
  18.     fi
  19.     

  20. done <list

  1. pm@debian:~$ time ./multi.sh
  2. hello i am 1. 23:41:23
  3. hello i am 4. 23:41:23
  4. hello i am 2. 23:41:23
  5. hello i am 3. 23:41:23
  6. finish jobs: 13482 13483 13485 13487 || 23:41:24
  7. hello i am 5. 23:41:24
  8. hello i am 8. 23:41:24
  9. hello i am 6. 23:41:24
  10. hello i am 7. 23:41:24
  11. finish jobs: 13495 13496 13497 13500 || 23:41:25
  12. hello i am 9. 23:41:25
  13. hello i am 11. 23:41:25
  14. hello i am 12. 23:41:25
  15. hello i am 10. 23:41:25
  16. finish jobs: 13508 13509 13510 13513 || 23:41:26
  17. hello i am 13. 23:41:26
  18. hello i am 14. 23:41:26
  19. hello i am 15. 23:41:26
  20. hello i am 16. 23:41:26
  21. finish jobs: 13521 13522 13524 13526 || 23:41:27

  22. real 0m4.049s
  23. user 0m0.012s
  24. sys 0m0.000s


如果把后台任务数修改为8的话

  1. pm@debian:~$ time ./multi.sh
  2. hello i am 7. 23:43:54
  3. hello i am 5. 23:43:54
  4. hello i am 3. 23:43:54
  5. hello i am 8. 23:43:54
  6. hello i am 4. 23:43:54
  7. hello i am 1. 23:43:54
  8. hello i am 6. 23:43:54
  9. hello i am 2. 23:43:54
  10. finish jobs: 13597 13598 13600 13602 13603 13604 13606 13607 || 23:43:55
  11. hello i am 9. 23:43:55
  12. hello i am 10. 23:43:55
  13. hello i am 11. 23:43:55
  14. hello i am 15. 23:43:55
  15. hello i am 14. 23:43:55
  16. hello i am 12. 23:43:55
  17. hello i am 13. 23:43:55
  18. hello i am 16. 23:43:55
  19. finish jobs: 13622 13623 13625 13627 13628 13630 13631 13632 || 23:43:56

  20. real 0m2.061s
  21. user 0m0.004s
  22. sys 0m0.008s
如果觉得没有必要记录后台的PID
也可以直接使用这样的形式:
  1. fun(){
  2. echo "hello i am $1. $(date '+%T')"
  3. sleep 1
  4. }
  5. i=0
  6. while read job
  7. do
  8. fun $job &
  9. i=$((i+1))
  10. if [ $i -ge 8 ];then
  11. wait
  12. echo "finish jobs|| $(date '+%T')"
  13. i=0
  14. fi


  15. done



阅读(2452) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~