首页 > 系统相关 >使用shell并发执行系统命令

使用shell并发执行系统命令

时间:2023-03-21 12:12:21浏览次数:37  
标签:-% status shell 系统命令 echo 并发 tm linux log

一 解决方案

旧方案为挨个执行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>&- 关闭读

 

标签:-%,status,shell,系统命令,echo,并发,tm,linux,log
From: https://www.cnblogs.com/bushuwei/p/17239530.html

相关文章

  • 二级菜单、多个Ajax请求的并发执行
    二级菜单     多个Ajax请求的并发执行     ......
  • Linux启动Java程序jar包Shell脚本
    手动方式启动和终止java程序启动java程序jar:nohupjava-jarXXX.jar查看程序占用pid:ps-ef|grepXXX.jar或jpsjps是jdk提供的一个查看当前java进程的小工具,查询Lin......
  • 计算并发用户数五种方法
    https://blog.csdn.net/MENG_Q_Z/article/details/125034279 一、经典公式1:  一般来说,利用以下经验公式进行估算系统平均并发用户数和峰值: 1)平均并发用户数 C=......
  • 高并发高可用架构设计之LVS
    LVS简介        LVS的英文全称是LinuxVirtualServer,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内核2.6中,它已经成为内核的一部分,在......
  • 02 Power Shell介绍
    PowerShell介绍特点win7以上默认安装脚本可以在内存中运行,不需要写入磁盘几乎不会出发杀软可以远程执行是windows脚本执行更容易cmd.exe的运行通常会被阻止,但是Po......
  • 01 查看Power Shell版本
    查看PowerShell版本通过PowerShell自身的命令win+r打开运行powershell输入以下之一命令查看powershell版本$PSVersionTable$PSVersionTable.PSVERSIONget-ho......
  • Jenkins远程执行shell脚本,超时报错(ERROR: Exception when publishing, exception mess
    通过Jenkins远程执行脚本时,发现Jenkins构建任务失败,但是服务器本身的脚本是生效的。排查确认是Jenkins构建任务超时,导致Jenkins看板显示任务构建失败,但是服务器上的自动脚......
  • JAVA并发
    并发三要素:可见性:一个线程对共享变量的修改,另一个线程能马上看到(CPU缓存引起)原子性:一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。......
  • JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
    文章目录​​什么是JUC?​​​​4大常用并发工具类​​​​CountDownLatch​​​​CyclicBarrier​​​​Semaphore​​​​Exchanger​​什么是JUC?JUC就是java.util.concu......
  • Xshell7 & Xftp7个人免费版安装教程(许可弹窗解决)
    官网下载:https://www.xshell.com/zh/xshell-download/下载Xshell和Xftp对家庭和学校用户提供免费许可证,个人可以免费使用(非商业),没有选项卡限制,商用需购买许可证哦。......