shell脚本中的多线程

很多场景中会用到多线程,例如备份数据库,有100个库,正常备份效率极其低下。有了多线程原本可能需要10个小时备份,现在分10个线程同时去干,只要一个小时就解决了。今天就介绍下shell中如何使用多线程去完成一些操作,提高我们的效率。

首先我们需要了解以下一些知识点:

1、文件描述符

[root@localhost ~]# touch file1         #先创建一个文件

[root@localhost ~]# exec 6<> file1   #通过exec的方式向当前进程号中丢入一个文件描述符6,关联文件为file1

[root@localhost ~]# ll /proc/$$/fd    #查看当前进程号的文件描述符

total 0

lrwx------ 1 root root 64 Jun 19 13:38 0 -> /dev/pts/0

lrwx------ 1 root root 64 Jun 19 13:38 1 -> /dev/pts/0

lrwx------ 1 root root 64 Jun 19 13:38 2 -> /dev/pts/0

lrwx------ 1 root root 64 Jun 19 13:39 255 -> /dev/pts/0

lrwx------ 1 root root 64 Jun 19 13:38 6 -> /root/file1    #我们丢进来的文件描述符,关联着file1文件

[root@localhost ~]# echo "this is test file" >/proc/$$/fd/6       #向当前进程号的文件描述符6中写入一段内容

[root@localhost ~]# cat file1     #查看file1文件,发现与我们刚写入文件描述符中的内容一致

this is test file

===================================================================================

[root@localhost ~]# rm -rf file1   #删除文件file1

[root@localhost ~]# ll /proc/$$/fd/6    #查看当前进程号中文件描述符6的状态,不难看出对应file1文件的状态问deleted

lrwx------ 1 root root 64 Jun 19 13:38 /proc/14530/fd/6 -> /root/file1 (deleted)

[root@localhost ~]# cp  /proc/$$/fd/6 file1   #拷贝文件描述符6为file1

[root@localhost ~]# cat file1   #查看file1文件,内容与删除一样,未变。有一点,这个复原的file1文件不再是原来的了,因为文件描述符状态依旧为deleted

this is test file

[root@localhost ~]# exec 6<&-      #释放文件描述符

==================================================================================

2、命名管道

[root@localhost ~]# ls *.txt | grep test  #  | 为我们的匿名管道

test2.txt

test.txt

[root@localhost ~]# mkfifo file-fifo   #创建一个命名管道文件file-fifo

[root@localhost ~]# file file-fifo        #查看文件类型为name pipe,命令管道文件,它的特点是1、即拿即用,用完就消失 2、先进先出

file-fifo: fifo (named pipe)

==============================================================================

#起两个终端测试一下

#终端一

[root@localhost ~]# grep "vd" file-fifo

#终端二

[root@localhost ~]# ls /dev/ > file-fifo

操作完终端二后你会发现终端一马上就会有结果显示,但是你再次grep "vd"的时候则没有任何结果,这就是命名管道文件的特点,即拿即用,用完消失。

==================================================================================

看完上面两个知识点,就进入到我们脚本的正题,如何实现多线程。

脚本如下:

#!/bin/bash
##################
#多线程批量创建用户
#dingxiang
##################
#定义20个线程,以及fifo文件名称
thread=20
file=$(pwd)/file_thread
#创建fifo文件,丢个文件描述符6进去,把fifo文件删掉
mkfifo $file
exec 6<> $file
rm -rf $file #向文件描述符6中写入20个空行
for i in `seq $thread`
do
        echo >&6
done #创建alice1-alice500个用户
for j in `seq 500`
do
#read -u 读文件描述符6
        read -u 6
#创建用户,因为每次拿20个空行,所以创建完之后再还20个空行回去
        {
        useradd alice$j
        echo "123123" | passwd --stdin alice$j  &>/dev/null
        echo "alice$j creat....."
        echo >&6
        }&
done
#等待上面所有的操作结束
wait
#释放文件描述符,echo;all is ok
exec 6>&-
echo "all is ok......."

执行脚本会发现,用户创建成功给予的提示是一组一组刷出来的,而不是之前一个个的创建,一个个的提示。

事实上这样并不是真正意义上的多线程,只是伪多线程,但在实际场景中真的很好用。

转载于:https://blog.51cto.com/13760226/2411191

shell脚本(多线程批量创建用户)的更多相关文章

  1. (转)通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加

    通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加 原文:http://www.21yunwei.com/archives/4773 有一个朋友问我如何批量创建用户和设置密码 , ...

  2. shell脚本,批量创建10个系统帐号并设置密码为随机8位字符串。

    [root@localhost wyb]# cat user10.sh #!/bin/bash #批量创建10个系统帐号wangyb01-wangyb10并设置密码(密码为随机8位字符串). > ...

  3. shell脚本实例-实现监控tcp的链接状态另一种方式批量创建用户

    Array实现TCP的链接状态 #!/usr/bin/bash declare -A status type=`ss -an | grep :80|awk '{print $2}'` for i in ...

  4. Linux 下批量创建用户(shell 命令)

    第一种方法: 用shell批量创建用户,分为2中:1,批量创建的用户名无规律 :2.批量创建的用户名有规律首先,来说下批量创建的用户名无规律的shell:先把需要批量创建的用户名用一个文本文档列出来, ...

  5. shell编写一个批量添加用户脚本

                                                          shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...

  6. [工具] 分布式系统下批量创建用户及分发公钥打通ssh通道的脚本

    在分布式系统下偶尔会有这样的需求,要增加一个服务时,需要在集群的所有节点上创建同一个用户,然后打通ssh通道,再分发软件包.配置.执行命令.启动服务... 这个问题的根源是如何集中配置和管理系统,专业 ...

  7. shell批量创建用户随机密码

    批量创建用户随机密码企业面试题3:批量创建10个系统帐号usr01-usr10并设置密码(密码为随机8位字符串). #! /bin/bash . /etc/init.d/functions Path= ...

  8. SERVER 2012 R2 core域环境下批量创建用户

      Write by xiaoyang 转载请注明出处 步骤一:创建域 基本配置 1.         输入命令进入配置 2.         输入8进入网络配置 3.         选择要配置的网 ...

  9. linux系统批量创建用户和生成8位随机密码

    1.1    脚本案例 批量创建20个用户,用户名为user1-user20,并生成8位随机登录密码,用户组采用键盘输入的方式,并将用户名及登录密码保存到/tmp/create_user.txt普通文 ...

随机推荐

  1. Shell:Day06.笔记

    sed命令 Linux文本处理三剑客 之 sed sed stream EDite  作为行编辑器,对文本进行编辑(以行为单位进行编辑)  注意:sed编辑文件,却不改变原文件:  sed的工作原理: ...

  2. 数据挖掘入门系列教程(八点五)之SVM介绍以及从零开始推导公式

    目录 SVM介绍 线性分类 间隔 最大间隔分类器 拉格朗日乘子法(Lagrange multipliers) 拉格朗日乘子法推导 KKT条件(Karush-Kuhn-Tucker Conditions ...

  3. android之间的各项信息传输类型

    首先是activity想fragment怎样动态的传输数据: 一:activity与fragment之间进行数据传递是,在Activity中将要传递的数据封装在一Bundle中,使用setArgume ...

  4. 路由与交换,cisco路由器配置,基础知识点(一)

    基础知识点 1.路由器与交换机端口初始化区别 路由器的所有接口默认都是关闭的 交换机的所有接口默认都是打开的 2.路由器 fastEthernet 端口 fastEthernet 0/0 第一个0代表 ...

  5. Java第十五天,泛型

    一.定义 泛型是一种未知的数据类型,即当我们不知道该使用哪种数据类型的时候,可以使用泛型. 泛型的本质是为了  参数化 类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型) ...

  6. String 对象-->lastIndexOf() 方法

    1.定义和用法 lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,如果指定第二个参数 start,则在一个字符串中的指定位置从后向前搜索. 语法: string.lastInde ...

  7. STC15W串口通信的一些梳理

    由于控制串口1进行通信移植到串口3出现了阻力,因此很有必要对串口通信进行更进一步的梳理>>>> 一 STC15W串口对应引脚: 由此我们得到四个串口引脚分别为:串口1:P3 . ...

  8. AJ学IOS 之微博项目实战(4)微博自定义tabBar中间的添加按钮

    AJ分享,必须精品 一:效果图 自定义tabBar实现最下面中间的添加按钮 二:思路 首先在自己的tabBarController中把系统的tabBar设置成自己的tabBar(NYTabBar),这 ...

  9. 设计模式中巧记I/O

    一.I/O 1. I/O操作中的设计模式 概要 以设计模式角度,自顶向下理解I/O源码结构 理解字节与字符的关系 1.1 装饰者模式(输入流为例) 背景:通过继承扩展对象耦合度高,使用装饰者扩展可以在 ...

  10. zathura-vim风格轻量级pdf阅读器

    安装(arch/manjaro) yay -Sy zathura-pdf-poppler 0.2.9-1 使用 `快捷键` gg 行首 G 行尾 j/k/h/l 单行移动 J/K 或 Ctrl + f ...