使用shell并发执行系统命令

2023-05-16

一 解决方案

旧方案为挨个执行shell_exec,串行执行,虽然执行很快,奈何监听命令众多,redis连接有等待时间等,有的还需要执行多次取平均值,所以执行完已超过1min

故,改为并发执行命令,单个命令加timeout,则永远可以在10s左右执行完!

  • golang形式,需要在该php-server上安装go环境,虽然简单,但生产环境尽量不乱动配置
  • php-swoole形式,同上,一个shell文件而已,没必要挨个server都装拓展
  • shell的循环&形式,循环体内正则匹配因为本人不熟悉,直接丢给php文件来处理

二 linux.sh

timest=$(date "+%Y-%m-%d %H:%M:%S")
echo "start: "$timest

SERVER=manager-admin
DEBUG=0
while getopts ":s:d:" opt
do
	case $opt in
		s)
			SERVER="$OPTARG"
		;;
		d)
			DEBUG="$OPTARG"
		;;
	esac
done

mkfifo /home/log/crontab/linux_status
exec 0316<>/home/log/crontab/linux_status
rm -rf /home/log/crontab/linux_status
for ((n=1;n<=10;n++));do #10>cmd num ji ke
	echo >&0316
done

for ((i=1;i<=7;i++));do
	read -u0316
{
	if [ $i == 1 ]
	then
		#负载
		QDATA=$(timeout 10 sar -q 1 5)
		echo "$QDATA" >> "/home/log/crontab/linux_status_"$SERVER"_compelet_q.cron.log"
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "负载|end: "$process_tm
	elif [ $i == 2 ]
	then
		#CPU
		CPUDATA=$(timeout 10 sar -u 1 5)
		echo "$CPUDATA" >> "/home/log/crontab/linux_status_"$SERVER"_compelet_cpu.cron.log"
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "CPU|end: "$process_tm
	elif [ $i == 3 ]
	then
		#内存
		MEMDATA=$(timeout 10 sar -r 1 5)
		echo "$MEMDATA" >> "/home/log/crontab/linux_status_"$SERVER"_compelet_mem.cron.log"
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "内存|end: "$process_tm
	elif [ $i == 4 ]
	then
		#磁盘IO
		IODATA=$(timeout 10 sar -d 1 5)
		echo "$IODATA" >> "/home/log/crontab/linux_status_"$SERVER"_compelet_io.cron.log"
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "磁盘IO|end: "$process_tm
	elif [ $i == 5 ]
	then
		#磁盘空间
		DISKDATA=$(timeout 10 df -h)
		echo "$DISKDATA" >> "/home/log/crontab/linux_status_"$SERVER"_compelet_disk.cron.log"
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "磁盘空间|end: "$process_tm
	elif [ $i == 6 ]
	then
		#redis_h5
		if [ $SERVER == "manager-admin" ]; then
			php /home/sh/linux_status/linux_status_redis.php $SERVER h5
		fi
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "redis_h5|end: "$process_tm
	elif [ $i == 7 ]
	then
		#redis_admin
		if [ $SERVER == "manager-admin" ]; then
			php /home/sh/linux_status/linux_status_redis.php $SERVER admin
		fi
		process_tm=$(date "+%Y-%m-%d %H:%M:%S")
		echo "redis_admin|end: "$process_tm
	else
		echo "not known"$i
	fi

	echo >&0316
}&
done
wait
# echo "linux_status_compelet"
exec 0316<&-
exec 0316>&-
timemid=$(date "+%Y-%m-%d %H:%M:%S")
echo "mid: "$timemid
php /home/sh/linux_status/linux_status.php $SERVER $DEBUG
timeend=$(date "+%Y-%m-%d %H:%M:%S")
echo "end: "$timeend

  

三 linux_status_redis.php、linux_status.php

分别为redis连接命令和对并发进程输出文件进行正则匹配,此处略

四 说明

  • shell各个进程通信我暂时通过文本,效率低下,因为并发不大暂时未改进
  • getopts获取调用脚本的参数-s servername -d 是否debug模式
  • mkfifo filepath 创建命名管道,exec 0316<>/home/log/crontab/linux_status创建文件描述符并关联到管道文件
  • echo >&0316 read -u0316 类似于golang、swoole的阻塞管道,做并发协程数控制的
  • 循环体&为丢到子进程执行,wait等待所有子进程执行完毕,不wait则可能子进程未执行完而父进程直接end了
  • exec 0316<&- 关闭文件描述符的写,exec 0316>&- 关闭读

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用shell并发执行系统命令 的相关文章

随机推荐

  • 数据库关系代数思维导图

  • 关于树莓派VNC图形登录界面重复登录,并显示can not show the desktop的解决办法。

    最近我也遇到了这么一个烦人的问题 xff0c 就是树莓派一直重复登录都登不进去 首先介绍一下背景 xff0c 我用树莓派的官方镜像烧录工具重新烧录了我之前的备份 xff0c 但是发现putty可以远程登录到pi 而使用vnc远程登录无法登录
  • Ubuntu开机进入终端完成自救

    由于设置了etc下的关键配置 xff0c 导致系统一直卡在开机界面进不到系统桌面 xff0c 所以记录下自救的过程 1 重启开机后选择Ubuntu高级选项 xff0c 然后点击带有Recover的 xff0c 再点击Drop to root
  • 女生写的如何追mm.看完后嫩头青变高手

    我是女生 xff0c 看到有的男生想追自己喜欢的女孩子又不敢追 xff0c 还想人家倒追她 xff0c 我很反感 从一个女生的角度 xff0c 我比较了解女孩子的心理 女孩子大多不会主动出击 xff0c 去追求自己喜欢的男孩 xff0c 除
  • 使用Dockerfile创建docker镜像

    在Dockerfile中用到的命令有 FROM FROM指定一个基础镜像 xff0c 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令 至于image则可以是任何合理存在的image镜像 FROM 一定是首个非注释指
  • Ubuntu下软件更新无法安装的问题

    Ubuntu安装软件提示 需要安装不能信任的软件包 解决办法 用 Ubuntu 安装输入法软件包时提示 需要安装不能信任的软件包 xff0c 这个动作需要从没有授权的软件源来安装软件包 xff0c 赋予权限执行仍然无法安装 xff0c 上网
  • 【C#】C#中FTP的操作

    C 完成与FTP服务器交互的功能代码 包括连接FTP 上传文件 下载文件 创建文件夹 删除文件夹 目录列表 获取指定文件大小 对文件的重命名 移动文件 判断路径是否存在等功能 using System using System Collec
  • 深浅层特征融合——CBNet

    写在前面 本系列博客 深浅层特征融合 对几篇出现较新的深浅层特征融合算法进行简要介绍 xff0c 多为本人的论文笔记 xff0c 记录了一个深度学习小学生在看论文时想到的问题 论文题目 xff1a CBNet A Novel Composi
  • U盘安装mips架构的Deepin(或UOS)系统及配置适用的源

    安装环境 请确保您的电脑满足以下的配置要求 xff0c 如果您的电脑配置低于以下要求 xff0c 将无法完美地体验深度操作系统 xff1a 内存 xff1a 至少 2G 内存 RAM xff0c 4G 以上是达到更好性能的推荐值硬盘 xff
  • label smooth方法论文调研

    待看论文 xff1a When Does Label Smoothing Help xff08 重点要看的 xff09 Regularizing Neural Networks by Penalizing Confident Output
  • 动手实践——docker中利用jupyter对数据增强操作进行可视化

    整体流程 docker容器内搭建合适环境 gt 开启jupyter notebook gt 浏览器里敲数据增强操作代码 gt 可视化 搭建环境 参考博客 https segmentfault com a 1190000007448177 1
  • 半监督-SelfMatch-论文阅读笔记

    阅读背景 SimCLR在2020年2月第一次挂在arxiv上 xff0c 被ICML 2020接收 FixMatch在2020年1月第一次挂在arxiv上 xff0c 被NIPS 2020接收 概括总结 SelfMatch方法和 FixMa
  • AI提效工具|借助chatgpt快速读论文,快速总结、归纳、索引相似文章

    目前新论文层出不穷 xff0c 快速阅读论文 成为研究者们一个必备能力 本文简单记录了近期出现的两个借助chatgpt来帮助我们快速读论文的 神器 xff0c 帮助大家快速上手应用 xff0c 迅速提升论文阅读速度 此外 xff0c 本人也
  • 【更新中】目标检测——梳理,准备面试

    最近在准备找工作面试 xff0c 本文在此梳理了目标检测中涉及的面试要用的知识点 xff0c 包含了一下几方面 xff1a My paper reading 过程总结 xff1a 实际步骤所花时间评价改进先看了abstract 1 intr
  • python——迷宫问题总结

    关于迷宫问题 xff0c 常见会问能不能到达某点 xff0c 以及打印到达的最短路径 可以用回溯法 43 递归来解决 代码一 xff1a dfs 43 回溯 将矩阵外围以及路障统一设置为 1 设置current step和next step
  • (等待填坑)深度学习——蒸馏loss、蒸馏学习

    提出问题 参考博客 1 知识蒸馏 2 蒸馏
  • 图像篡改检测方向(Tamper Detection\ image forencis detection)学习笔记汇总(未完成)

    写在前面 最新在啃这个方向的论文 xff0c 零零总总找来了有几十篇 xff0c 目前自己也没看完 xff0c 下图中上面几行标星号的是自己打算多看几眼的 xff1a 这篇博客里会介绍几篇这个方向里做得比较好的几篇论文 demo工具 如果你
  • CELF优化的贪心算法

    用一个例子说明如下 xff1a 问题描述如下 xff1a 从一组节点中 xff0c 取出一组k个种子节点S xff0c 使得产生的增益最大 对任意的a属于A xff0c f a xff1a a加入之后的增益 有如下一个表 xff1a 初始扫
  • Linux磁盘分区基本分区

    目录 前言 一 磁盘简介 1 名词 2 类型 1 xff09 机械硬盘 2 xff09 固态硬盘 3 尺寸 4 接口 IDE和SATA的区别 5 术语 6 命名 7 分区方式 1 xff09 MBR 2 xff09 GPT 二 管理磁盘 1
  • 使用shell并发执行系统命令

    一 解决方案 旧方案为挨个执行shell exec xff0c 串行执行 xff0c 虽然执行很快 xff0c 奈何监听命令众多 xff0c redis连接有等待时间等 xff0c 有的还需要执行多次取平均值 xff0c 所以执行完已超过1