Linux 多进程实现方法
1、需求
查找192.168.0.*网段中所有未使用过的IP
2、实现
我们知道查找未使用IP的方法可以使用ping命令完成。对于单个IP的判断,使用命令如下
$ ping -c 192.168.0.1
PING 192.168.0.1 (192.168.0.1) () bytes of data.
bytes from 192.168.0.1: icmp_seq= ttl= time=0.031 ms --- 192.168.0.1 ping statistics ---
packets transmitted, received, % packet loss, time 0ms
rtt min/avg/max/mdev = 0.031/0.031/0.031/0.000 ms
如果上述类似消息,则判断该IP是连通的即在使用中。如果没有,则可以判断未使用(这里不考虑对端服务器ping被禁用的情况)。如果只是查找一个IP,可以多试几个就知道了,但是这种效率太低,可以写个循环批量查找下。
#!/bin/bash for i in $(seq );do
ip="192.168.0.${i}"
ping -c ${ip} &>/dev/null
[ $? -ne ] && printf "${ip} can not reachable\n"
done
这个例子实现了批量查找192.168.0.*网段内未使用过的IP。但是执行时候发现效率很低,可以自己执行看下运行效果。显然,这没有解决效率的问题。这时我们考虑使用多进程解决这个问题。看下面例子。
#!/bin/bash MAX_THREAD_NUM= for i in $(seq );do
ip="192.168.0.${i}"
(
ping -c ${ip} &>/dev/null
[ $? -ne ] && printf "${ip} can not reachable\n"
)&
num_ping=`ps -ef | grep "ping" | grep -v grep | wc -l`
while [ "${num_ping}" -gt "${MAX_THREAD_NUM}" ];do
sleep
num_ping=`ps -ef | grep "ping" | grep -v grep | wc -l`
done
done
wait
执行发现效率数倍提升。上述的例子是利用&将进程放到后台执行,并且通过循环判断当前ping命令执行的进程数来控制进程数量。这里MAX_THREAD_NUM设置的为50,考虑ping不太消耗资源可以还可以调整更大。如果是消耗资源多的命令应该将MAX_THREAD_NUM调小。具体根据服务器性能和命令消耗资源情况调整。
还有一种利用文件描述符、read的方法,我们一块写下看下,效果是一样的,例子如下
#!/bin/bash temp_fifofile="/tmp/$$.fifo"
mkfifo ${temp_fifofile}
exec <>${temp_fifofile}
rm ${temp_fifofile} MAX_THREAD_NUM=
for ((i=;i<${MAX_THREAD_NUM};i++));do
echo
done >& for((i=;i<=;i++));do
read -u5
(
ip="10.135.17.${i}"
ping -c ${ip} &>/dev/null
[ $? -ne ] && printf "${ip} can not reachable\n"
echo >&
)&
done
wait
exec >&-
exit
如果是其他需要多进程执行的命令,可以修改一下。根据实际情况选择这两种方法之一实现。方法一相对更好理解。
Linux 多进程实现方法的更多相关文章
- 第一种SUSE Linux IP设置方法
第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168. ...
- 学习linux/unix编程方法的建议(转)
假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...
- SSH连接不上Linux的解决方法
SSH连接不上Linux的解决方法: 连续弄了几次,今天早上终于把SSH连接虚拟机连接不通的问题解决了. 先简单说下概要: 主机装的是XP系统,虚拟机用的是red hat Linux. 我用的是nat ...
- 嵌入式linux多进程编程
嵌入式linux多进程编程 在主程序显示文本菜单.提供例如以下服务.要求每一个服务都通过生成子进程来提供. 服务包含:日历信息显示,日期信息显示,推断闰年服务,文件复制功能,数字排序功能.退出功能. ...
- <1>Linux日志查找方法
Linux日志查找方法 适用于测试,开发,运维人员,用来查找Linux服务器问题的一般方法,比较实用,如果有更好的办法可以一块讨论,欢迎大神们来指导哈!!! 进入正题 第一步.通过Xshell登录服务 ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux压缩打包方法连载之三:bzip2, bzcat 命令
Linux压缩打包方法有多种,本文集中讲解了bzip2, bzcat 命令的使用.案例说明,例如# 与 gzip 同样的,都是在计算压缩比的参数,-9 最佳,-1 最快. AD: 我们遇见Linux压 ...
- Linux多进程之间的文件锁
之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作.故想到了文件锁. Linux下可以使用flock()函数对文件进行加锁解锁等操作.简单介绍下flock()函数: 表头 ...
- Linux多进程CS服务器简单测试
Linux多进程CS服务器简单实现 server端 多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端. 代码实现 #include <stdio ...
随机推荐
- 0000 - Spring 中常用注解原理剖析
1.概述 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来 ...
- unity3d 通过代码建立曲面
using UnityEngine;using System;using System.Collections.Generic; using System.Collections;using Syst ...
- layui之初始化加分页重复请求问题解决
layui框架中的page困扰我很久,一个页面初始化后并且分页,导致初始化渲染请求一次,分页再请求了一次,一个接口就重复请求了2次,通过不停的分析和测试,最终解决了这个问题. 基于JQ的ajax二次封 ...
- AI的胜利,人类的荣耀
在围棋界,AI战胜人类,这不是人类的耻辱,是人类的荣耀. 看到柯洁悲伤哭泣的画面,曾经放出豪言的大男孩,低下了骄傲的头.我相信经过这样一次挑战,对他的成长有好处,无论是人生,还是棋艺. 在围棋领域,人 ...
- mysql下有符号数和无符号数的相关问题
最近自己的程序在调用mysql的存储过程传参给smallint类型变量的时候,总是出现out of range value的错误,刚开始用C数值转换方式的二进制位转换思路来思考时,总是觉得没什么问题, ...
- git 使用教程(二)
MyEclipse下使用GitHub方法(Eclipse同理) 原创 2016年01月04日 20:30:25 标签: myeclipse / 软件 / git / github / eclipse ...
- 20165205 预习作业三 Linux安装及学习
Linux安装及学习 安装Ubuntu 1)安装版本 在安装VirtualBox时选择了VirtualBox 5.2.6 platform package 安装Ubuntu时选择了Ubuntu 16. ...
- 判断B是不是A的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解答: class Solution: def HasSubtree(self, pRo ...
- 数据持久化—真机上的Plist写入
其实写入不到真机里面主要是你写入时,当前那文件夹里你要写入的plist根本不存在 所以你怎么写都写不进去,所以你必须先创建你要写入的plist; 你用这样初始化程序就能自己创建: NSMutableA ...
- eclipse创建maven组合项目
创建普通maven项目作为父项目: packaging类型选择pom. 创建子项目即可(需要mvn eclipse:eclipse构建为eclipse项目)