linux shell 多线程执行程序

Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。

直接看代码示例吧。

(1) 顺序执行的代码

 1 #!/bin/bash
 2 date
 3 for i in `seq 1 5`
 4 do
 5 {
 6     echo "sleep 5"
 7     sleep 5
 8 }
 9 done
10 date 

输出:

Sat Nov 19 09:21:51 CST 2016
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Sat Nov 19 09:22:16 CST 2016

(2) 并行代码

使用‘&‘+wait 实现“多进程”实现

 1 #!/bin/bash
 2 date
 3 for i in `seq 1 5`
 4 do
 5 {
 6     echo "sleep 5"
 7     sleep 5
 8 } &
 9 done
10 wait  ##等待所有子后台进程结束
11 date

输出:

Sat Nov 19 09:25:07 CST 2016
sleep 5
sleep 5
sleep 5
sleep 5
sleep 5
Sat Nov 19 09:25:12 CST 2016

(3) 对于大量处理任务如何实现启动后台进程的数量可控?

  简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成

  但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。

  更高级的实现可以看(4)

(4) 使用命名管道(fifo)实现每次启动后台进程数量可控。

 1 #!/bin/bash
 2
 3 function my_cmd(){
 4     t=$RANDOM
 5     t=$[t%15]
 6     sleep $t
 7     echo "sleep $t s"
 8 }
 9
10 tmp_fifofile="/tmp/$$.fifo"
11 mkfifo $tmp_fifofile      # 新建一个fifo类型的文件
12 exec 6<>$tmp_fifofile     # 将fd6指向fifo类型
13 rm $tmp_fifofile    #删也可以
14
15 thread_num=5  # 最大可同时执行线程数量
16 job_num=100   # 任务总数
17
18 #根据线程总数量设置令牌个数
19 for ((i=0;i<${thread_num};i++));do
20     echo
21 done >&6
22
23 for ((i=0;i<${job_num};i++));do # 任务数量
24     # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
25     # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
26     read -u6
27
28     #可以把具体的需要执行的命令封装成一个函数
29     {
30         my_cmd
31     } &
32
33     echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
34 done
35
36 wait
37 exec 6>&- # 关闭fd6
38 echo "over"

参考:http://lawrence-zxc.github.io/2012/06/16/shell-thread/

时间: 2024-08-01 02:06:22

linux shell 多线程执行程序的相关文章

Linux Shell 多线程编程

#!/bin/bash #---------------------------–  # 此例子说明了一种用wait.read命令模拟多线程的一种技巧  # 此技巧往往用于多主机检查,比如ssh登录.ping等等这种单进程比较慢而不耗费cpu的情况  # 还说明了多线程的控制  #---------------------------– function a_sub { # 此处定义一个函数,作为一个线程(子进程)    sleep 3 # 线程的作用是sleep 3s  } tmp_fifof

Linux Shell 多线程编程--原创

相关命令文件 1.runCommandInThreads.sh 多线程实现主代码 cdir=$(dirname $BASH_SOURCE) ##Current directory of this script file. source $cdir/logUtil.sh function createFile() { local dir=$1 local idx=$2 local fl="$dir/$idx" touch $fl } function execShellCommand()

linux之多线程fork:进程通信

++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func(int sig); sig 指明了所要处理的信号类型,handler是SIG_IGN,SIG_DFL或者返回值为整数的函数地址. 当执行了signal函数后,进程只要接收到类型为sig 的信号,就立即执行 func()函数,不管其正在执行程序的哪一部分.当func()函数执行结束后,程序返回到进程被

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux Shell 程序调试

Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的"调试信息".当然,用户也可以在shell程序中的适当位置加入一些echo命令用于调试与跟踪.   方法一:在运行脚本程序时加入调试选项: [用法]bash –选项 ./shellScript.sh 几个常用的调试选择项如下:         -e :如果一个命令返回一个非0退出状态值(失败),就退出.         -n 

Linux内核---多线程

A.     线程和进程的差别 在现代操作系统中,进程支持多线程.进程是资源管理及分配的最小单元:而线程是程序执行的最小单元.一个进程的组成实体可以分为两大部分:线程集和资源集.进程中的线程是动态的对象,代表了进程指令的执行过程.资源,包括地址空间.打开的文件.用户信息等等,由进程内的线程共享.线程有自己的私有数据:程序计数器,栈空间以及寄存器. 现实中有很多需要并发处理的任务,如数据库的服务器端.网络服务器.大容量计算等.传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发,

Linux Shell 简介

什么是linux Shell Shell 是一个用户程序,或是一个为用户与系统交互提供的环境. 它是一个执行从标准输入设备读入的命令的语言解释程序,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序所调用. 当你登录或打开控制台时Shell就会运行. Shell不是系统内核的一部分,但是它使用系统内核执行程序.创建文件等. 2.访问Shell的方式 终端.安全ssh连接.使用控制台. 3.在Shell下,你可以使用如下按键组合来编辑和回调命令. ctrl+W:删除光标位置前的单

linux之多线程frok(一)

linux下实现多线程有两种函数调用:一种是通过pthread.h里面已经封装好的函数调用,另一种是通过unistd.h里面的fork函数调用.前面已经已经列举了pthread的使用,下面来书fork的例子. 一.fork函数 简单的fork例子 #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { pid_t pid; pid=f

Linux Shell脚本教程

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {