shell中并发执行多个进程

简介: shell中并发执行多个进程

在 Shell 脚本中,你可以使用以下几种方式来并发执行多个进程:

1. 使用 & 符号

在命令结尾添加 & 符号,可以将命令放到后台运行,从而实现并发执行。例如:

#!/bin/bash

command1 &
command2 &
command3 &
...

以上脚本中的每一个命令都会在后台并发启动。

2. 限制并发数

若要控制并发进程的数量,可以使用 xargsparallel 工具,或者自己编写循环并结合 wait 命令来实现。

例如,使用 xargs 并限制并发数为 N

ls *.sh | xargs -P N -I {
   } bash {
   }

其中 -P 参数指定了最大并发数,-I {} 指定占位符,bash {} 表示执行每一个找到的 .sh 文件。

3. 使用 GNU Parallel

GNU Parallel 是一个强大的工具,专门设计用于轻松地实现 shell 命令的并行执行,同时支持限制并发数量。

parallel -j N ::: 'command1 arg1' 'command2 arg2' 'command3 arg3'

这里的 -j N 表示同时运行的最大作业数。

4. 自己编写控制并发的循环

当不使用外部工具时,可以通过循环和计数器来手动控制并发进程:

#!/bin/bash
max_processes=5
count=0

for cmd in $(cat commands.txt); do
    if [ "$count" -lt "$max_processes" ]; then
        eval "$cmd" &
        ((count++))
    else
        wait -n || true # 等待任意一个子进程完成并继续下一个
        ((count--))
    fi
done

# 确保没有遗留的后台进程
wait

在这个例子中,脚本读取 commands.txt 文件中的每一条命令,并且只在活跃进程数少于设定的最大进程数时才启动新进程。wait -n 用于等待第一个完成的子进程,而 || true 是为了防止非零退出码导致脚本意外终止。

通过上述方法,您可以灵活地在 Shell 脚本中控制并发执行多个进程,以达到优化性能或资源利用率的目的。

目录
相关文章
|
5月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
79 3
|
5月前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
41 1
|
3月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
4月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
3月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
3月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
75 0
|
4月前
|
存储 缓存 NoSQL
进程内缓存助你提高并发能力!
进程内缓存助你提高并发能力!
|
5月前
|
数据库 数据安全/隐私保护 C++
Python并发编程实战:线程(threading)VS进程(multiprocessing),谁才是并发之王?
【7月更文挑战第10天】Python并发对比:线程轻量级,适合I/O密集型任务,但受GIL限制;进程绕过GIL,擅CPU密集型,但通信成本高。选择取决于应用场景,线程利于数据共享,进程利于多核利用。并发无“王者”,灵活运用方为上策。
79 2
|
5月前
|
大数据 API 数据处理
Python高手都在用的并发秘籍:解锁线程与进程的终极奥义,性能飙升不是梦!
【7月更文挑战第8天】Python并发编程提升性能,线程(threading)适合I/O密集型任务,如网络请求,通过`start()`和`join()`实现并发。进程(multiprocessing)利用多核CPU,适用于CPU密集型任务,如大数据处理。结合两者可优化混合任务,实现最佳并发效果。
38 1
|
5月前
|
消息中间件 算法 Java
(十四)深入并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解
本文深入探讨了并发编程的关键概念和技术挑战。首先介绍了进程、线程、纤程、协程、管程等概念,强调了这些概念是如何随多核时代的到来而演变的,以满足高性能计算的需求。随后,文章详细解释了死锁、活锁与锁饥饿等问题,通过生动的例子帮助理解这些现象,并提供了预防和解决这些问题的方法。最后,通过一个具体的死锁示例代码展示了如何在实践中遇到并发问题,并提供了几种常用的工具和技术来诊断和解决这些问题。本文旨在为并发编程的实践者提供一个全面的理解框架,帮助他们在开发过程中更好地处理并发问题。