精华内容
下载资源
问答
  • 分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用。以下脚本功能是...

    分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用。

    以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包。

    #!/bin/bash

    ip=`cat iplist.txt|grep -v “#”|awk ‘{print $1}’`   #过滤服务器IP

    dir=’/usr/local/src’  #目标路径

    thead_num=50 #自定义并发数,根据自身服务器性能或应用调整大小,开始千万别定义太大,避免管理机宕机

    tmp_fifo_file=”/tmp/

    .fifo”  #以进程ID号命名管道文件

    mkfifo $tmp_fifo_file   #创建临时管道文件

    exec 4<>$tmp_fifo_file  #以读写方式打开tmp_fifo_file管道文件,文件描述符为4,也可以取3-9任意描述符

    rm -f $tmp_fifo_file    #删除临时管道文件,也可不删除

    for ((i=0;i

    do

    echo “”  #输出空行

    done >&4  #输出重导向到定义的文件描述符4上

    for i in $ip  #循环所有要执行的服务器

    do

    read -u4  #从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行

    {

    scp -P 1000 $1 $i:$dir    #所有要批量执行的命令都放在大括号内,scp是一个简单实例,可替换任意其他命令及命令组,1000为服务器端的端口

    sleep 3  #暂停3秒,给系统缓冲时间,达到限制并发进程数量

    echo “” >&4  #再写入一个空行,使挂起的循环继续执行

    }&  #放入后台执行

    done

    wait  #等待所有后台进程执行完成

    exec 4>&-  #删除文件描述符

    exit 0

    ——————————–低调的分割线————————————

    如果管理机与其他服务器没有建立ssh信任,也可将expect自动应答命令添加到并发脚本的循环体当中,修改如下:

    #!/bin/bash

    ip=`cat iplist.txt|grep -v “#”|awk ‘{print $1}’`

    dir=’/usr/local/src’

    answer=”yes”     #定义yes/no应答变量

    passwd=”123456″  #服务器密码

    thead_num=50

    tmp_fifo_file=”/tmp/.fifo”  #以进程ID号命名管道文件 mkfifo $tmp_fifo_file   #创建临时管道文件 exec 4<>$tmp_fifo_file  #以读写方式打开tmp_fifo_file管道文件,文件描述符为4,也可以取3-9任意描述符 rm -f $tmp_fifo_file    #删除临时管道文件,也可不删除 for ((i=0;i&4  #输出重导向到定义的文件描述符4上   for i in $ip  #循环所有要执行的服务器 do         read -u4  #从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行                 {                         scp -P 1000 $1 $i:$dir    #所有要批量执行的命令都放在大括号内,scp是一个简单实例,可替换任意其他命令及命令组,1000为服务器端的端口                         sleep 3  #暂停3秒,给系统缓冲时间,达到限制并发进程数量                         echo “” >&4  #再写入一个空行,使挂起的循环继续执行                 }&  #放入后台执行 done wait  #等待所有后台进程执行完成 exec 4>&-  #删除文件描述符 exit 0  ——————————–低调的分割线———————————— 如果管理机与其他服务器没有建立ssh信任,也可将expect自动应答命令添加到并发脚本的循环体当中,修改如下: #!/bin/bash ip=`cat iplist.txt|grep -v “#”|awk ‘{print $1}’` dir=’/usr/local/src’ answer=”yes”     #定义yes/no应答变量 passwd=”123456″  #服务器密码 thead_num=50 tmp_fifo_file=”/tmp/

    .fifo”

    mkfifo $tmp_fifo_file

    exec 4<>$tmp_fifo_file

    rm -f $tmp_fifo_file

    for ((i=0;i

    do

    echo “”

    done >&4

    for i in $ip

    do

    read -u4

    {

    expect <

    set timeout -1

    spawn scp -P 1000 $1 $i:$dir

    expect “(yes/no)?” {

    send “$answer\r”

    expect “Password:”

    send “$passwd\r”

    } “Password:” {send “$passwd\r”} “*host” {exit 1}

    expect eof

    EOF

    sleep 3

    echo “” >&4

    }&

    done

    wait

    exec 4>&-

    exit 0

    展开全文
  • 分享一个入门级可控多线程shell脚本方案 下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割、各个击破。 先来 1 段场景描述: 某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几...
  • 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法。 download()方法种首先用 urlopen() 方法打开远程资源并通过 Content-Length获取资源...
  • 在业务开发过程中,经常会在后台写一些shell脚本处理数据,但估计很多人不知道shell脚本也可以支持多线程,而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。 需求 为了更好的说明问题,我们...

    目录

    一、场景

    二、初步的优化

    三、线程数控制优化方案


    一、场景

       以下代码在执行的时候,整个for循环执行完毕,大概需要10000s的时间,这个时间是相当长的

    #!/bin/bash
    #
    
    for(( j=0;j<=10000;j++ ))
    do
       echo "success"$j
       sleep 1s
    done

    二、初步的优化

     为了让以上代码段执行效率提高,时间缩短,那么我们需要对代码进行优化,代码如下

    #!/bin/bash
    #
    
    for(( j=0;j<=10000;j++ ))
    do
    {
       echo "success"$j
       sleep 1s
    }&
    done
    wait

    此时的代码可能在1s内就能执行完,原因是此时执行的代码自动生成了10000个线程,待所有的线程结束后,才进入主线程。那么问题来了。

    1.如果自动生成10000个线程,都交给了计算机本身的cpu进行计算,那么如果计算机相对应的负荷只支持88个怎么办。

    2.生成的线程是否及时回收关闭。

    3.那如何进行对线程数进行控制。

    三、线程数控制优化方案

    #!/bin/bash
    THREAD_NUM=500
    TMP_FILE="/tmp/$$.fifo"
    
    trap "exec 6>&-;exec 6<&-;exit 0" 2     #脚本运行过程中,如果接收到信号2(Ctrl+C)中断命令,则关闭文件描述符6的读写,并正常退出
    
    mkfifo ${TMP_FILE}  #创建有名管道
    exec 6<>${TMP_FILE} #创建文件描述符,文件描述符可使用3-(n-1),n取值范围:ulimit -n。以读写(<,读;>,写)方式绑定TMP_FILE管道文件。标识对文件描述符6的所有操作等同于对管道文件TMP_FILE的操作
    rm -rf ${TMP_FILE}  #为什么不直接使用管道文件?因为管道的一个重要特性:读写必须同时存在,缺失某个操作,另一个操作就会滞留。绑定文件描述符(读、写绑定)正好解决了这个问题
    
    for ((J=1;J<=${THREAD_NUM};J++)) #向管道中中输入THREAD_NUM个并发数量的空行。为什么写入空行而不是字符?那是因为管道文件的读取是以行为单位。
    do
        echo >&6
    done
    
    START_TIME=`date +%s`
    
    for ((I=1;I<=1000;I++))
    do 
        read -u6 #从管道中读取行,每次读一行。每读一次就会减少一个空行,直到管道中没有回车符,所有行读取完毕后执行挂起,实现线程数量控制。
        {
            echo "${I}: success" ; sleep 2
            echo >&6    #任务在后台执行结束后,向文件描述符中写入一个空行。如果不在向描述符中写入空行,当后台放入THREAD_NUM个任务之后,由于描述符中没有可读取的空行,会导致read -u6停顿。
        }&
    done
    wait
    
    STOP_TIME=`date +%s`
    echo "TIME: $(expr ${STOP_TIME} - ${START_TIME})"
     
    exec 6>&-
    exec 6<&-

    根据线程控制的方案,我们可以看到,10000个执行效率仅需14秒左右,此处的线程设置为1000,虽然比不上第二种,但是这种方式是可控的。

    展开全文
  • matlab 自己是支持多线程的,开启方式可以使用命令:matlabpool local但是这种方式通常不太好用,需要特殊设计的matlab代码,并不是所有m文件都可以在这种模式下运行。 在linux下,可以通过另一种方式让程序同时执行...

    matlab 自己是支持多线程的,开启方式可以使用命令:

    matlabpool local

    但是这种方式通常不太好用,需要特殊设计的matlab代码,并不是所有m文件都可以在这种模式下运行。 在linux下,可以通过另一种方式让程序同时执行多个matlab脚本或同时多次执行一个matlab脚本,下面只针对后一种情况进行说明。这个问题的解决思路如下: 让 多个shell脚本并行执行是很容易的事情,只需要

    ./a.sh &

    ./b.sh &

    ./c.sh &

    此时多个脚本都放在后台执行,并且系统会自动将不同脚本交给不同cpu去执行。显然,如果将上面的不同脚本替换为我们要执行的matlab脚本,就可以实现我们目的了。那么如何能通过脚本执行matlab呢? 开心的是,这也很容易实现:

    matlab -nodesktop -nosplash - nojvm -r “PARA=$1;run_design_mth;quit”

    将以上命令放在一个shell 脚本中,然后多次执行该脚本,就可以实现并行计算。需要几个CPU去执行就重复几次(当然不能超过你电脑CPU的核数)。

    ./single.sh para &

    ./single.sh para &

    ./single.sh para &

    当然,脚本后面一定要加上你想要的参数,这样才能让每个脚本实现不同的功能。传给 single.sh 的参数para会通过x=$1这个语句传递给matlab,在matlab所执行的脚本中,PARA的值就是传入的参数。传递多个参数的方法可类推。

    展开全文
  • 多线程卡死或者崩溃的时候,bt直接显示的堆栈可能不是崩溃的那个,那么就 需要分析所有的堆栈,可以采用的方式就是把所有的堆栈log下来,这样可以使用文本分析器或者编写脚本去进行处理 log所有的堆栈的方式如下: ...

    多线程卡死或者崩溃的时候,bt直接显示的堆栈可能不是崩溃的那个,那么就 需要分析所有的堆栈,可以采用的方式就是把所有的堆栈log下来,这样可以使用文本分析器或者编写脚本去进行处理

    log所有的堆栈的方式如下:

    首先要进入gdb的界面

    然后一次输入如下指令:

    set logging file xxxx.txt

    set pagination off

    set logging file on

    thread apply all bt

    set logging off

     

    这样就会在当前录下生成一个xxxx.txt的文件,有所有的线程的堆栈信息

     

    展开全文
  • 转载网址:http://www.centoscn.com/shell/2013/0731/823.html
  • Linux 多线程(C++)

    2021-01-21 15:13:19
    Linux 多线程例子,使用C++实现。包括生产者消费者问题和银行排队叫号问题的写法,在Linux系统中使用g++即可编译使用(附带自动编译脚本,即使不熟悉g++也可以直接执行sh脚本编译使用)。代码工整,注释详细,适合...
  • shell脚本实现多线程

    千次阅读 2019-08-09 20:32:31
    shell脚本实现多线程 在服务器上执行find查找命令时候,由于查找目录较大,可能耗时较长。基于最近的工作,记录一下使用shell脚本实现在当前目录下的子目录并发查找,并将结果回收的功能。 主脚本 main.sh 实现分发...
  • LINUX SHELL脚本攻略

    2019-01-28 08:25:42
    inux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix...
  • linux shell 多线程执行程序

    千次阅读 2019-06-19 09:40:59
    linux shell 多线程执行程序 Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。 直接看代码示例吧。 (1) 顺序执行的代码 #!/bin/bash date for i in `seq 1 5` do { echo ...
  • 1.介绍 (1)等待作业号或者进程号...(3)在shell中使用wait命令不跟参数,相当于是多线程,等待全部线程执行完毕才执行后续命令。 2.语法 wait [进程号或作业号] 如果wait后面不带任何的进程号或作业号,那么.
  • 一个在Linux下模拟多线程的并发的方法,使用这个方法可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多。 1、不使用多线程的情况 /Users/nisj/...
  • 基于python多线程实现Linux任务并发执行
  • Linux Shell脚本 多线程

    千次阅读 2015-09-13 22:28:34
    在bash中,我们通过后台运行(&)实现多线程。 for((i=1;i;i++)) do mongo="mongo_00$i" acmeair_web="acmeair_web_00$i" { docker run --name $mongo -d -p $port_m:27017 mymongodb docker run -d -p $port:...
  • Python脚本定时任务 import datetime import schedule import threading import time import os from datetime import datetime, date, timedelta ### #执行命令 def dituTask(): yesterday = (date.today() + ...
  • Bash脚本多线程处理

    千次阅读 2020-01-16 14:39:56
    在bash中并没有线程的概念,我们可以用多进程来模拟多线程的操作来达到同样的效果 示例代码 #!/bin/bash # thread number can modify if needed THREAD=10 ROOTDIR="$(pwd)" TMP_FIFO="/tmp/$.fifo" #cannot del ...
  • 一、shell处理多线程 在特殊情况下需要同时启动多个程序,而且要求执行的命令不能停止完再执行下一条。即顺序执行是不满足要求的,因此,此时需要用到多线程处理。具体实现方法如下图所示: 方式:shell 的for循环...
  • 这是Centos系统中,自动下载并且安装axel包的一个脚本,使用完可以使用axel多线程来下载镜像源中的文件,非常快速好用
  • Linux:结束线程的三种方式

    千次阅读 2021-05-10 09:27:59
    一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于...
  • Shell脚本是顺序执行的,但是系统允许多个Shell脚本同时执行,为了达到资源的综合利用,也就是把服务器往死里用,有时候需要一段脚本对多个脚本进行多线程的调度,并且等待完成之后继续执行后续的脚本。   主脚本...
  • linux获取线程ID

    千次阅读 2017-11-07 14:38:46
    原文地址:http://www.linuxidc.com/Linux/2014-01/94723.htm 最近一直在想: 如何确认两段代码是不是在同一个线程中执行的呢? 通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程的id...
  • Linux 多进程多线程编程

    千次阅读 2018-03-20 21:50:05
    消息队列是内核地址空间中的内部链表,通过Linux内核在各个进程之间传送内容,每个消息队列可以用IPC标识符位移地进行确认。不同的消息队列之间相互独立,每个消息队列中的消息,又构成一个独立的链表。 消息缓冲...
  • 下载于北大未名BBS精华区 内容:UNIX环境高级编程,Linux网络编程,Linux编程杂项,Linux窗口编程,Linux多线程编程,Linux脚本编程
  • 多线程执行for循环shell脚本

    万次阅读 多人点赞 2017-12-29 15:22:48
    需求:并发检测1000台web服务器状态(或者并发为1000台web服务器分发文件等)如何用shell实现?    方案一:(这应该是大多数人都第一时间想到的...start_time=`date +%s` #定义脚本运行的开始时间 for ((i=
  • Shell脚本中的任务并发执行 需求 实现一个脚本能够使用ping检测网络的连通性 可以同时检测个IP地址, 并且将检测结果输出 分析 正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的...
  • 多线程执行shell脚本

    千次阅读 2017-12-28 10:33:50
    Linux下模拟多线程的并发并发shell脚本  分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多...
  • 脚本语言的低级多线程消息缓冲区。 该程序包提供了用于线程间通信的内存中消息缓冲区。 该实现独立于基础线程库(例如或 )。 该软件包也可以通过LuaRocks获得,请参阅 。 请参阅下面的完整。 要求 经过测试的...
  • Linux】shell脚本实现并发

    千次阅读 2020-06-30 11:24:52
    如果命令相互之间存在交互,则情况就复杂了,那么不建议使用shell脚本来完成多线程的实现。 为了方便阐述,使用一段测试代码。在这段代码中,通过seq命令输出1到10,使用for...in语句产生一个执行10次的循环。每一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,149
精华内容 41,259
关键字:

linux多线程脚本

linux 订阅