设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 创业者 手机
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

linux中shell模拟多线程执行任务详情

发布时间:2022-06-16 13:56 所属栏目:48 来源:互联网
导读:多线程是对于linux系统来讲是小菜了,下面小编为各位整理一篇linux中shell模拟多线程执行任务详解,希望文章可以帮助到各位。 shell本身是不能实现多线程的,但是可以通过启动子进程,并将子进程放入后台执行来模拟多线程,为了在提高脚本执行效率的同时又不明显
  多线程是对于linux系统来讲是小菜了,下面小编为各位整理一篇linux中shell模拟多线程执行任务详解,希望文章可以帮助到各位。
 
  shell本身是不能实现多线程的,但是可以通过启动子进程,并将子进程放入后台执行来模拟多线程,为了在提高脚本执行效率的同时又不明显增加负载的作用,还需要对同时放入后台的进程数做下限制,代码如下:
 
  #!/bin/bash
  set -x  # 开启调试模式
  #判断是否有参数
  if [ $# != 1 ];then
      echo "您输入的参数有误"
      exit -1
  fi
  # 允许的最大进程数
  MAX_THREAD_NUM=5
  tmp_fifo_file=/tmp/$$.fifo # 以脚本运行的当前进程ID号作为文件名
  mkfifo "$tmp_fifo_file"    # 新建一个随机fifo管道文件
  exec 9<>"$tmp_fifo_file"   # 定义文件描述符9指向这个fifo管道文件
  rm "$tmp_fifo_file"
  # 预先写入指定数量的换行符到fifo管道文件中,一个换行符代表一个进程
  for((i=0;i<$MAX_THREAD_NUM;i++));do
       echo  
  done >&9
  # 循环读出url并判断状态码
  while read line
  do
  {
      # 进程控制
      read -u 9 # 从文件描述符9中读取行,实际指向fifo管道
      {
          isok=`curl -I -L -m 60 -o /dev/null -s -w %{http_code} $line`
          if [ "$isok" = "200" ];then
              echo $line "OK"
          else
              echo $line $isok
          fi
          echo >&9 # ,当前进程结束,往fifo管道文件中写入一个空行
      }&  //phpfensi.com
  }
  done < $1 wait echo '执行结束' exec 9>&- # 删除文件描述符9
  exit 0
  脚本的任务是对一个url列表中的网址进行判断,判断这些网址是否可以继续访问,具体方法是,通过curl获取http的状态码来判断.
 
  上面红色部分{}中的语句被放进子进程中在后台执行,当fifo中5个空行读完后,循环继续等待 read 中读取fifo数据,当后台的子进程完成任务后,排队往fifo输入空行,这样fifo中又有了数据,循环继续执行.
 
 
  说明:{} 这部分语句被放入后台作为一个子进程执行,这部分几乎是同时完成的,当fifo中10个空行读完后 while循环.
 
  继续等待 read 中读取fifo数据,当后台的10个子进程后,按次序排队往fifo输入空行,这样fifo中又有了数据,for语句继续执行.
 
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读