shell 设置进程数运行
问题描述
在服务器上提交任务时,需要限制运行的核的数目。程序本身是单线程的,但是不同的输入参数需要跑很多组,粗暴的方法是开多个终端,不断地去提交任务。但这比较麻烦,可以用 shell 实现。
基础
首先看第一种 shell 写法

#! /bin/bash
start=`date +%s`
for i in {..}
do
echo sucess
sleep
done
end=`date +%s`
echo "time: `expr $end - $start`"
- 如何提取当前时间,date +%s,返回值是从 1970 年至今的秒数。
- for 循环的写法。
- shell 中数学运算,注意 start 与 end 之间需要空格。
该程序的运行结果是 8 s,如果放在后台运行,则只需要 2 s,代码如下

#! /bin/bash
start=`date +%s`
for i in {..}
do
{
echo sucess
sleep
} &
done
wait
end=`date +%s`
echo "time: `expr $end - $start`"
- 需要使用 {} 将主执行程序包括,用 & 将其放入后台。
- 需要 wait 命令等待所有命令执行完成,不然系统会直接继续往下走。
这样做实现了多线程并发,但是问题是不能控制使用的进程数。因此引入了管道和文件操作符。
管道
- 比如 hexdump Run0035.bin | less 中的 | 就是管道,用于连接两个命令间的数据。
- 管道的特点是,如果管道中没有数据,那么取管道数据的操作就会停滞,直到管道中有数据;同样写管道的操作也是如此,如果没有读取操作,那么写操作也会停滞。意思就是管道需要既有读操作,也有写操作。
- 使用 mkfifo 命令可以创建有名管道
文件操作符
- 通过文件操作符,可以控制 linux 系统中 /proc 文件夹下的内容,从而控制 linux 中进程的运行。
代码
1 #!/usr/bin/env bash #设置变量
beta=0.25
gammaList=(22.0 24.0 26.0 28.0 30.0 32.0 34.0 36.0 38.0)
moiList=(4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0) start=`date +%s`
thread_num= trap "exec 1000>&-;exec 1000<&-;exit 0"
tmpfifo=$$.fifo
mkfifo $tmpfifo
exec <>$tmpfifo
rm -rf $tmpfifo for (( i=; i<$thread_num; i++ ))
do
echo >&
done for gamma in ${gammaList[@]}
do
if [ ! -d "gamma"$gamma ]; then
mkdir gamma$gamma
fi
outfile=`printf "terminal-out-%s" "$gamma"`
for moi in ${moiList[@]}
do
read -u1000
{
sh auto-run.sh $beta $gamma $moi > $outfile
echo >&
}&
done
done wait
end=`date +%s`
echo "times: `expr $end - $start`"
- 第 9 行,设置使用进程数.
- 第 11 行,表示脚本在运行过程中,如果接收到 ctrl+c,则则关闭文件描述符 1000 的读写,并正常退出。其中 exec >1000&- 代表关闭对文件描述符 1000 的写,exec <1000&- 代表关闭对文件描述符 1000 的读,trap 用于接受中断命令,2 代表 ctrl+c.
- 12 ~ 14 行,创建一个管道文件 PID.fifo,并与文件描述符 1000 做读写的绑定。如此一来,对文件描述符 1000 的操作就相当于对管道文件的操作,且该文件描述符又有管道的特性,即读写操作必须同时存在,否则会停滞。
- 第 15 行,将管道文件删除(不明白)
- 17 ~ 20 行,向文件描述符 1000 写入相应进程数的空行,用于控制进程数。
- 22 ~ 36 行,主体部分。第 30 行,从文件描述符 1000 读取 1 行,第 31 ~ 34 行,后台执行其中的命令,当第 32 行执行结束后,再向文件描述符 1000 中写入一个空行。结果就是,先读取了文件描述符 1000 中所有的行,读取完后因为没有写入,由于管道性质,该行为被阻塞,因此不会再读取,即不会再执行 read -u1000,但后台若有第 32 行的命令执行结束,便会执行第 33 行的写入命令,写入后 read -u1000 操作便不会阻塞,于是每当跑完一个后台,便可以提交下一个后台。
- 38 ~ 40 行,等待所有命令执行完成,输出耗时。
shell 设置进程数运行的更多相关文章
- curl命令,curl实现post,curl监控网页shell脚本,curl多进程实现并控制进程数,
cURL > Docs > Tutorial: http://curl.haxx.se/docs/httpscripting.html 下载单个文件,默认将输出打印到标准输出中(STDO ...
- Shell 脚本进程并发&进程数控制
Shell 都以串行的方式自上而下执行命令,不适用需要大量作业的场景. 学习此篇shell脚本进程并发,能够大大提高工作效率~ 通过wait 和 & 后台符号 可以实现并行,但无法控制进程数. ...
- IIS应用程序池最大进程数设置
1.当工作进程数>1时,如果有多个连接请求就会启动多个工作进程实例来处理,所启动的最多工作进程数就是你设置的最大进程数,后续更多的连接请求会循环的发送至不同的工作进程来处理.每个工作进程都能承担 ...
- oracle连接进程数设置
SQL> select count(*) from v$session #连接数SQL> Select count(*) from v$session where status='ACTI ...
- linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行
linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行 crontab每分钟执行一次,但5秒以上才有更新数据,有时候一分钟可能跑不完上一个进程,需要先等10秒再判 ...
- linux最大进程数、最大打开文件数
ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制.本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响 ...
- Linux 进程资源用量监控和按用户设置进程限制
每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...
- linux上限制用户进程数、cpu占用率、内存使用率
限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > ...
- shell学习三十八天----运行顺序和eval
运行顺序和eval shell从标准输入或脚本中读取的每一行称为管道,它包括了一个或多个命令,这些命令被一个或多个管道字符(|)隔开. 其实嗨哟非常多特殊符号可用来切割单个的命令:分号(;),管道(| ...
随机推荐
- [持续更新]——关于C++的一些可能会常用的函数
写在前面 这些函数都是我和朋友一点一点写出来的,可能部分代码会有点雷同,但大部分代码都是自我总结出来的.目前包含的函数功能分别是: 1.设置控制台颜色 2.设置控制台光标位置 3.隐藏控制台光标 4. ...
- itest(爱测试) 开源一站式敏捷测试管理平台&极简项目管理,重大升级(接口测试)6.0.0 发布
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...
- Python 函数为什么会默认返回 None?
Python 有一项默认的做法,很多编程语言都没有--它的所有函数都会有一个返回值,不管你有没有写 return 语句. 本文出自"Python为什么"系列,在正式开始之前,我们就 ...
- PAT 2-10. 海盗分赃(25)
题目链接:http://www.patest.cn/contests/ds/2-10 解题思路:参考:http://blog.csdn.net/linsheng9731/article/details ...
- SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- Ubutun重启网卡
一.network利用root帐户# service networking restart 或者/etc/init.d/networking restart 二.ifdown/ifup# ifdown ...
- golang目录
基础 golang安装及vscode编辑器配置 golang基础结构 golang基础数据类型 golang复合数据结构 goalng函数 golang方法 golang接口 golang并发 gol ...
- python3在科学计算中的三种常用数据结构
在科学研究中,数据运算是必不可少的,下面介绍python语言在科学计算中常用的数据结构和运算函数. 主要数据结构: (1)列表,用中括号表示,元素之间逗号分隔,每个元素可以是数字,字符,也可以是列表, ...
- python编程入门笔记
一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局 ...
- 牛客网PAT练兵场-锤子剪刀布
题目地址:https://www.nowcoder.com/questionTerminal/79db907555c24b15a9c73f7f7d0e2471 题解:无 /** * *作者:Ycute ...