03-28 周四 Linux 并行工具使用xargs和parallel

简介

 程序猿日常工作开发中,免不了要和linux服务器打交道的,如何高效的使用shell命令来实现我们的功能呢,比如说如下的场景:

  • 高效统计一个目录下每个目录的空间占用
  • 高效将一个服务器上的文件拷贝到其他多个服务器上。
  • 高效的启动多个服务器上的进程。

 诸如此类的场景,如果手动,一个一个ssh-scp,太枯燥了。因此,我们便需要高效的并行工具,启动多进程的方式来实现我们的目标。

在Linux中,并发查询多个目录的磁盘占用可以通过多种方法实现。以下是一些可以提高效率的策略:

xargs

使用xargs-P参数并行执行
xargs命令可以将标准输入数据转换为命令行参数,并执行指定的命令。结合-P参数,可以指定并行进程的数量。

find /path/to/search -type d -print0 | xargs -0 -I {} -P 10 du -sh {}

在这个例子中,find命令用于查找所有目录,-print0xargs -0确保了文件名中的特殊字符(如空格)被正确处理。-P 10指定了并行进程的数量,这里设置为10,你可以根据系统资源调整这个数值。
 再提供另外两个实践
 统计数据模型加载时间

ls  | grep 256  | xargs -t  -n 1 sh -c 'egrep "module data load time" $0 | tail -n 50'

 使用5个进程统计当前目录下各个目录的空间大小

ls | grep -v \^[a-k] |xargs -I {} -P 5 sh -c "du -sh {}"

使用ls| grep -v 来过滤需要的目录,其中a-k已经统计过了。
 下面是结合xargs和rsync将当前目录下的所有目录同步到远端机器上。

# 使用rsync同步imagenet目录到远端的gpfs目录下。
rsync -rvza -e "ssh -p 31022" imagenet root@10.106.11.11:/gpfs
rsync -rvza -e "ssh -p 31022" valfull root@10.106.11.11:/gpfs/imagenet
# 这个是代码目录

/mnt/sf-nfs/self-define/tanke/ddl/demo_code
ls | xargs -P 3 -I {} rsync -rvza -e "ssh -p 31022" {} root@10.106.11.11:/gpfs/demo_code

ls -l1 | grep '^d' | sort -k 9 | awk -F " " '{print $9}' | xargs -I {} -P 48 sh -c "du -sh {}"

 下面是一些其他的例子
xargs 是一个非常有用的命令行工具,它可以构建并执行命令行,这些命令行由标准输入或管道传递的数据生成。以下是一些 xargs 的示例命令及其解释:

  1. 基本使用

    echo -e "apple\nbanana\ncherry" | xargs echo "Fruit: "
    

    这个命令会将 “apple”、“banana” 和 “cherry” 作为输入,并通过 xargs 传递给 echo 命令,输出为 “Fruit: apple”、“Fruit: banana” 和 “Fruit: cherry”。

  2. 使用 -I 选项进行替换

    echo -e "apple\nbanana\ncherry" | xargs -I % echo "Fruit: %"
    

    -I 选项允许你指定一个替换字符串(在这里是 %),它在命令中被输入项替换。输出结果与上一个例子相同,但使用了不同的方法。

  3. 限制并行进程数

    find . -name "*.txt" | xargs -P 5 rm -f
    

    -P 选项允许你指定同时运行的最大进程数。在这个例子中,find 命令查找所有 .txt 文件,然后 xargs 并行删除这些文件,最多同时运行 5 个 rm 进程。

  4. 使用 -n 选项指定每次调用的参数数量

    seq 10 | xargs -n 2 echo "Number: "
    

    -n 选项指定每次调用命令时传递的参数数量。在这个例子中,seq 10 生成 10 个数字,xargs 每次传递两个数字给 echo 命令,输出为 “Number: 1 2”、“Number: 3 4” 等。

  5. 使用 -d 选项定义输入项分隔符

    echo -e "apple,banana,cherry" | xargs -d ',' echo "Fruit: "
    

    -d 选项允许你指定输入项的分隔符。在这个例子中,分隔符是逗号 ,xargs 会为每个水果名称执行 echo 命令。

  6. 使用 -p 选项进行交互式执行

    ls | xargs -p rm -f
    

    -p 选项会在执行每个命令之前提示用户确认。在这个例子中,ls 列出当前目录的文件,xargs 准备删除这些文件,但在删除前会询问用户。

  7. 结合 xargsawk 进行复杂操作

    find . -type f -name "*.txt" | awk -F '/' '{print $NF}' | sort | uniq | xargs -I % touch %
    

    这个命令链首先查找所有 .txt 文件,然后 awk 提取文件名,sortuniq 去除重复项,最后 xargs 为每个唯一的文件名创建一个新的空文件。

  8. 使用 -0--null 选项处理包含空格和特殊字符的文件名

    find . -type f -print0 | xargs -0 rm -f
    

    -0 选项告诉 xargs 输入项是以 null 字符分隔的,这对于处理包含空格、引号或其他特殊字符的文件名非常有用。

这些例子展示了 xargs 的多种用法,包括基本的文本处理、并行执行、交互式确认以及处理特殊字符和空格。在使用 xargs 时,请确保理解每个选项的含义,以避免意外的行为。

parallel

. 使用parallel命令
parallel是一个shell工具,用于在多个核心上并行执行任务。如果你的系统安装了parallel,可以使用以下命令:

find /path/to/search -type d | parallel du -sh {}

parallel会自动根据系统的核心数来决定并行任务的数量。你也可以使用--jobs参数来手动指定并行任务数。

parallel 是一个非常强大的命令行工具,它允许你并行执行任务。以下是一些 parallel 的例子,展示了不同参数的用法:

  1. 基本使用

    parallel echo ::: a b c
    

    这个命令会并行地输出 abc。默认情况下,parallel 会尝试使用所有可用的 CPU 核心。

  2. 指定任务数

    parallel -j 4 echo ::: a b c d e f g h
    

    使用 -j 参数来指定同时运行的任务数。在这个例子中,parallel 会尝试同时运行 4 个任务。

  3. 使用百分比

    parallel -j 50% echo ::: a b c d e f g h
    

    使用百分比来指定任务数。在这个例子中,parallel 会使用系统可用 CPU 核心的 50% 来运行任务。

  4. 串行任务

    parallel -j 1 echo ::: a b c
    

    设置 -j 1 会使得所有任务串行执行,即使有多个输入项。

  5. 使用不同的任务模板

    parallel 'echo {} is a fruit' ::: apple orange banana
    

    这个命令会输出每个水果名称后面跟着 “is a fruit”。{} 是一个占位符,代表输入项。

  6. 使用重定向文件作为输入

    parallel 'echo {} is a fruit' :::: fruits.txt
    

    使用 ::: 从文件 fruits.txt 中读取输入项。

  7. 并行删除多个文件

    parallel 'rm {}' ::: /path/to/file1 /path/to/file2 /path/to/file3
    

    使用 parallel 并行删除指定的文件。请谨慎使用,因为 rm 命令会永久删除文件。

  8. 使用shell命令作为任务

    parallel 'bash -c "echo {}; sleep 1"' ::: a b c
    

    执行一个复杂的shell命令,这里每个任务都会输出一个字母,然后暂停1秒。

  9. 限制内存使用

    parallel -j 4 --block 20% 'bash -c "echo {}; sleep 1"' ::: a b c
    

    使用 --block 参数来限制任务的内存使用。在这个例子中,每个任务将尝试使用不超过系统可用内存的 20%。

  10. 使用嵌套循环

    parallel 'echo {} is {}' ::: a b c ::: 1 2 3
    

    使用两个输入列表,parallel 会将第一个列表中的每个元素与第二个列表中的每个元素组合,并执行命令。

这些例子展示了 parallel 的一些基本用法和参数。在实际使用中,你可能需要根据具体任务调整参数。在使用 parallel 时,请确保理解每个参数的含义,以避免意外的行为。

编写脚本或使用循环

你可以编写一个简单的shell脚本或使用循环结构来并发执行du命令。

#!/bin/bash
directories=(/path/to/dir1 /path/to/dir2 /path/to/dir3)
for i in "${directories[@]}"; do
   du -sh "$i" &
done
wait

这个脚本会并发地对每个目录执行du -sh命令,&将命令放入后台执行。wait命令用于等待所有后台任务完成。

使用subprocess模块(Python)

如果你熟悉Python编程,可以使用subprocess模块来并发执行多个du命令。

import subprocess

directories = ["/path/to/dir1", "/path/to/dir2", "/path/to/dir3"]
processes = []

for directory in directories:
    p = subprocess.Popen(["du", "-sh", directory])
    processes.append(p)

for proc in processes:
    proc.wait()

这段Python代码会创建多个进程来并发执行du命令,并等待它们全部完成。

请注意,过多的并发可能会对系统性能产生影响,特别是在磁盘I/O密集型操作如du命令时。确保在执行并发任务时,系统资源充足,以避免不必要的性能下降。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/497894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS Pro横向水平图例

终于知道ArcGIS Pro怎么调横向图例了! 简单的像0一样 旋转,左转右转随便转 然后调整图例项间距就可以了,参数太多就随便试,总有一款适合你! 要调整长度,就调整图例块的大小。完美! 好不容易…

win10+cuda11.8+cudnn8.6.0安装

目录 一、NVIDIA 驱动程序下载 二、cuda11.8下载 三、cudnn8.6.0下载 四、确认cuda和cudnn是否安装成功 一、NVIDIA 驱动程序下载 1、查看显卡类型:连续按下CTRLALTDELETE -> 选择任务管理器 -> 性能 -> GPU -> 右上角 2、下载地址:官方…

阿里云CentOS7安装Hadoop3伪分布式

ECS准备 开通阿里云ECS 略 控制台设置密码 连接ECS 远程连接工具连接阿里云ECS实例,这里远程连接工具使用xshell 根据提示接受密钥 根据提示写用户名和密码 用户名:root 密码:在控制台设置的密码 修改主机名 将主机名从localhost改为需要…

iPhone用GPT替代Siri

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 前一段时间,因为iCloud协议的更新,我的云盘空间无法正常…

骗子查询系统源码

源码简介 小权云黑管理系统 V1.0 功能如下: 1.添加骗子,查询骗子 2.可添加团队后台方便审核用 3.在线反馈留言系统 4.前台提交骗子,后台需要审核才能过 5.后台使用光年UI界面 6.新增导航列表,可给网站添加导航友链 7.可添加云黑类…

Nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)

目录 Nginx和Sticky介绍 编译安装sticky的nginx环境 安装过程碰到的问题和编译安装过程遇到的错误: (1)第一个错误:修改源代码ngx_http_sticky_module.c (2)第二个错误:修改源代码ngx_http_s…

课堂练习——4、实验环境练习

任务描述 本关任务:修改 Linux 0.11 内核程序,将系统启动时显示的字符串由原来的Partition table ok.变为Hello, world!。 通过本关任务,可以熟悉 Linux 0.11 内核实验环境,掌握内核程序的编辑、编译和测试方法。 相关知识 为了…

Java基础(概念,环境,包,IDEA,)

目录 什么是Java 什么是程序 Java简史 Java技术体系平台 Java语言的特点 搭建环境 搭建Java开发环境 理解三个核心概念 安装Java环境 配置环境变量 编写第一段代码:HelloWorld 创建源代码文件 编写代码 保存文件 编译Java程序 运行程序 查看输出 编…

C#String的remove的用法

string test "abc";string temp test;temp.Remove(0, 1);temp temp.Remove(0, 1);Console.WriteLine(temp);Console.WriteLine(test);执行结果

前端基础知识html

一.基础标签 1.<h1>-<h6>:定义标题&#xff0c;h最大&#xff0c;h最小 2.<font>&#xff1a;定义文本的字体&#xff0c;尺寸&#xff0c;颜色 3.<b>&#xff1a;定义粗体文本 4.<i>&#xff1a;定义斜体文本 5.<u>&#xff1a;定义文本下…

MGRE实验

MGRE实验 1、实验要求 2、实验分析 IP地址分类 私网IP&#xff1a;192.168.1.0等隧道IP&#xff1a;192.168.5.0和192.168.6.0公网IP&#xff1a;15.0.0.1等 配置IP地址 配置acl访问控制列表 用于将内部网络中的私有IP地址转换为公共IP地址&#xff0c;以实现与外部网络的通…

[flink 实时流基础系列]揭开flink的什么面纱基础一

Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 文章目录 0. 处理无界和有界数据无界流有界流 1. Flink程序和数据流图2. 为什么一定要…

多焦点图像融合文献学习(一)

本文介绍的是一篇明为"A convolutional neural network-based conditional random field model for structured multi-focus image fusion robust to noise."的文献&#xff0c;主要包括文献的摘要、前言摘选、主要贡献、网络结构、实验结果及结论等方面。 文献名称摘…

浅谈Mysql(三)——MySQL/InnoDB 事务隔离级别分享

主要内容 事务特性 • 原子性&#xff08;Atomicity • 一致性&#xff08;Consistency&#xff09; • 隔离性&#xff08;Isolation&#xff09; • 持久性&#xff08;Durability 日志体系-更新语句的执行过程 • redo log • binlog 事务隔离 隔离性遇见的问题 隔离级…

Golang-Gin光速入门

安装 go get -u github.com/gin-gonic/gin初始化项目并启动服务 go mod init gin-project package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message"…

2.11 Python关键字(保留字)

Python关键字&#xff08;保留字&#xff09;一览表 保留字是Python 语言中一些已经被赋予特定意义的单词&#xff0c;这就要求开发者在开发程序时&#xff0c;不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。 Python 包含的保留字可以执行如下命令进行…

GRE VPN——配置实验

1&#xff0c;按照图示配置IP地址 r1&#xff1a; r2&#xff1a; r3&#xff1a; 2&#xff0c;在R1和R3配置默认路由使公网区域互通 [R1]ip route-static 0.0.0.0 0 100.1.1.2 R3]ip route-static 0.0.0.0 0 100.2.2.2 3&#xff0c;在R1和R3上配置GRE VPN&#xff0c;使…

追踪Aurora(欧若拉)勒索病毒,Emsisoft更新解密工具

Aurora(欧若拉)勒索病毒首次出现于2018年7月左右&#xff0c;加密后的文件后缀为Aurora&#xff0c;2018年11月&#xff0c;此勒索病毒的一款变种样本&#xff0c;加密后的文件后缀为Zorro&#xff0c;同时发现了此勒索病毒的一个BTC钱包地址&#xff1a; 18sj1xr86c3YHK44Mj2…

第二证券今日投资参考:低空经济迎利好 自动驾驶商业化提速

昨日&#xff0c;两市股指盘中弱势震动&#xff0c;午后加快下探&#xff0c;沪指失守3000点大关&#xff0c;深成指、创业板指跌超2%&#xff1b;到收盘&#xff0c;沪指跌1.26%报2993.14点&#xff0c;深成指跌2.4%报9222.47点&#xff0c;创业板指跌2.81%报1789.82点&#x…

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…