shell脚本(多线程批量创建用户)
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脚本(多线程批量创建用户)的更多相关文章
- (转)通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加
通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加 原文:http://www.21yunwei.com/archives/4773 有一个朋友问我如何批量创建用户和设置密码 , ...
- shell脚本,批量创建10个系统帐号并设置密码为随机8位字符串。
[root@localhost wyb]# cat user10.sh #!/bin/bash #批量创建10个系统帐号wangyb01-wangyb10并设置密码(密码为随机8位字符串). > ...
- shell脚本实例-实现监控tcp的链接状态另一种方式批量创建用户
Array实现TCP的链接状态 #!/usr/bin/bash declare -A status type=`ss -an | grep :80|awk '{print $2}'` for i in ...
- Linux 下批量创建用户(shell 命令)
第一种方法: 用shell批量创建用户,分为2中:1,批量创建的用户名无规律 :2.批量创建的用户名有规律首先,来说下批量创建的用户名无规律的shell:先把需要批量创建的用户名用一个文本文档列出来, ...
- shell编写一个批量添加用户脚本
shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...
- [工具] 分布式系统下批量创建用户及分发公钥打通ssh通道的脚本
在分布式系统下偶尔会有这样的需求,要增加一个服务时,需要在集群的所有节点上创建同一个用户,然后打通ssh通道,再分发软件包.配置.执行命令.启动服务... 这个问题的根源是如何集中配置和管理系统,专业 ...
- shell批量创建用户随机密码
批量创建用户随机密码企业面试题3:批量创建10个系统帐号usr01-usr10并设置密码(密码为随机8位字符串). #! /bin/bash . /etc/init.d/functions Path= ...
- SERVER 2012 R2 core域环境下批量创建用户
Write by xiaoyang 转载请注明出处 步骤一:创建域 基本配置 1. 输入命令进入配置 2. 输入8进入网络配置 3. 选择要配置的网 ...
- linux系统批量创建用户和生成8位随机密码
1.1 脚本案例 批量创建20个用户,用户名为user1-user20,并生成8位随机登录密码,用户组采用键盘输入的方式,并将用户名及登录密码保存到/tmp/create_user.txt普通文 ...
随机推荐
- 关于MySQL Notifiter的简单使用
MySQL Notifiter是MySQL 数据库的辅助工具. 1.打开MySQL Notifiter Command Line Client,输入密码:123456(这是我自己的) 2.创建一个名为 ...
- C++中的字符串切片操作
string str = "hello"; str.substr(0,2); //输出"he", 表示[0,2)
- Python 参数使用总结
Python 中参数的传递非常灵活,不太容易记住理解,特整理如下备忘: 普通参数 即按照函数所需的参数,对应位置传递对应的值,可以对应 Java 中的普通参数 def max(a, b): if a ...
- Mysql索引、explain执行计划
1.索引的使用场景 哪些情况使用索引: 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 where 3.多表关联查询中,关联字段应该创建索引on两边都要创建索引 select * f ...
- 使用docker搭建selenium grid 分布式环境
本文章只做docker搭建selenium grid 分布式环境步骤说明,对于selenium grid中的参数.流程.原理等不做说明.selenium grid的详细情况可查看官方文档https:/ ...
- 【python实现卷积神经网络】损失函数的定义(均方误差损失、交叉熵损失)
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- MODIS系列之NDVI(MOD13Q1)四:MRT单次及批次处理数据
前言: 本篇文章的出发点是因为之前接触过相关研究,困囧于该系列资料匮乏,想做一个系列.个人道行太浅,不足之处还请见谅.愿与诸君共勉. 数据准备: MODIS数据产品MOD13Q1—以2010年河南省3 ...
- python 自动生成model 文件 案例分析
生成方式 Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件 sqlacodegen 你可以通过pip去安装: pip install sql ...
- shell 数组遍历加引号和不加引号的区别?
前言 shell 是一个比较神奇的国度,里面有太多的坑需要填,今天需要填的坑就是,数组遍历在使用时加了引号和不加引号的区别. 案例 解析: 不加引号,数组中元素间的“空格”就会编程换行符 加引号, ...
- AJ学IOS 之小知识之_xcode插件的删除方法_自动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自动提示,
AJ分享,必须精品 一:解决解决自动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自动提示 其实,插件神马的我们自己也能写,并没有想象中的那么难,不过目前我们还是先解决当前问题 在做微 ...