热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化后的标题:在Linux/WSL环境中进行Shell任务的并行处理测试与分析

在Linux/WSL环境中,本文对Shell任务的并行处理进行了详细的测试与分析。通过多种并行处理技术,如GNUParallel和xargs,探讨了如何有效提升任务执行效率和系统资源利用率。实验结果表明,合理配置并行参数能够显著缩短任务完成时间,提高系统整体性能。此外,文章还介绍了Shell脚本编写的基本原则和最佳实践,为读者提供了实用的参考。

1 shell简介

参考来源https://www.runoob.com/linux/linux-shell.html

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

Shell 编程跟 Javascript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)……

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

2 shell入门

(1)输出函数

echo "hello"
printf "world"

(2)变量赋值和调用

class=1 #不允许中间有空格
echo ${class} #加上{}是好习惯
declare -a arr #定义数组
echo ${arr[i]} #调用数组
let "j+=1" #累加方式一
j=$(($j+1)) #累加方式二

(3)判断

num=$(cat ./a.log)
if ((${#nums}>3)) #${#nums}调用nums的长度, 双括号(())
then
echo "hello"
fi

(4)循环

for i in `seq 0 5` # while也可以
do
echo $i
done

(5)正则匹配

C_name=$(echo $file|grep -Po '[A-Z][1-2]?_[A-Za-z]+')

(6)读取时间

current_time=$(date "+%Y.%m.%d %H:%M:%S")

(7)输出文档

echo "hello" > out.txt # 覆盖
echo "hello" >> out.txt # 续写

(8)读取

cat ./a.log

3 shell并行计算控制

在linux中,常用做法是引入了任务队列的概念,类似socket举例中的消费者生产者模型,通过消息队列来调节供需的不平衡,参考https://blog.csdn.net/qq_34409701/article/details/52488964

而在windows subsystem for linux中,管道与命名管道(FIFO文件)无法使用,因为windows系统不支持管道与命名管道(FIFO文件)。找了很久也没看到其他可用的方法,因此,这里介绍一个自己想的笨方法,借助的是文件输出和读取。

#!/bin/bash
num=3 # 并行数上限
echo 0 > a.log
for i in `seq 1 12`
do {while (1)dosleep ${i}s # 任务开始时通过sleep让任务按次序进行尝试&#xff0c;同时也使得执行任务尝试降低频次cur&#61;$(cat ./a.log) # 记录当前的并行任务数if (($cur<3)) # 如果任务数未超过最大限制则可执行&#xff0c;反之则需等待thencur&#61;$(($cur&#43;1))echo $cur > a.log./out.shcur&#61;$(cat ./a.log) # 完成任务之后&#xff0c;将记录的并行任务数减1cur&#61;$(($cur-1))echo $cur > a.logecho "current: "$i", nums of processing:" $cur", completed: "$com"/"12break # 完成任务之后&#xff0c;跳出循环&#xff0c;未完成则继续尝试fidone}& # &用于并行控制
done
wait # 保证所有任务都能完成


推荐阅读
author-avatar
hedongsheng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有