-
实现一个脚本能够使用ping检测网络的连通性
-
可以同时检测多个IP地址, 并且将检测结果输出
正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令
。例如:
#!/bin/bash
for i in {1..10};do
echo $i
echo "END"
结果如下:
可见,循环体中的“echo $i”命令是串行执行的。但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡住而失去响应。
这里,我们的需求是:编写一个脚本,扫描192.168.0.0/24网络里某个区间网段有哪些主机在线,能ping通就认为在线。下面是写好的代码:
#!/bin/bash
for i in {65,66,67,72,73,68};do
ip="192.168.0.$i"
ping -c 2 $ip &> /dev/null && echo $ip is up
这里对脚本中使用的ping命令稍作说明:Linux中的ping命令在执行后会连续不断地发包,而且使用了“-c”选项,指定只发2次包,如果能收到响应,就认为目标主机在线。
从逻辑上看,这个脚本没有问题,但是由于要对网络中的多个IP地址轮流执行ping命令,在执行后耗时将非常长,而且此时的脚本无法使用Ctrl+C强制终止,只能使用Ctrl+Z转入后台,然后再用kill命令强制结束进程。
[root@localhost ~]
192.168.0.65 is up
192.168.0.66 is up
[1]+ 已停止 bash pinghost.sh
[root@localhost ~]
[1]+ 12496 停止 bash pinghost.sh
[root@localhost ~]
[root@localhost ~]
[1]+ 已杀死 bash pinghost.sh
实际上,在这个脚本中所循环执行的ping命令之间并没有依赖关系,也就是说不必非要等到“ping 192.168.0.65”结束之后才能接着执行“ping 192.168.0.66”,所有的这些ping命令完全可以并发执行。
如果是使用Python,则可以借助于多线程技术来实现命令的并发执行,而Shell不支持多线程,因此只能采用多进程的方式。具体的实现方法就是在要并发执行的命令后面加上“&”,将其转入后台执行,这样就可以在执行完一条命令之后,不必等待其执行结束,就立即转去执行下一条命令。修改后的代码如下:
#!/bin/bash
for i in {1..10};do
echo $i &
echo "END"
执行结果如下:
可见,在并发执行时不能保证命令的执行顺序,而且本应在整个循环执行结束之后再执行的echo "END"命令,却在程序一开始就被执行了。所以在并发执行时,我们通常都需要保证在循环体中的所有命令都执行完后再向后执行接下来的命令,这时就可以使用 wait命令来实现。
在Shell中使用wait命令,相当于其它高级语言里的多线程同步。修改代码如下:
for i in {1..10};do
echo $i &
echo "END"
此时的执行结果如下:
这样执行结果就正常了。
回到我们的问题上来,如果要检测多个IP的网络连通性,也可以使用上述过程的思路,代码如下:
#!/bin/bash
for i in {65,66,67,72,73,68};do
ip="192.168.0.$i"
ping -c 2 $ip &> /dev/null && echo $ip is up &
网络的检测结果如下:
[root@localhost ~]
192.168.0.65 is up
192.168.0.66 is up
192.168.0.72 is up
192.168.0.73 is up
192.168.0.67 is up
192.168.0.68 is up
因此,当在循环执行的命令之间没有依赖关系时,完全可以采用并发执行的方式,这样可以大幅提高代码执行效率。
当然,并发执行也有缺陷,就是当需要并行执行的命令数量特别多,特别是所执行的命令占用的系统资源非常多时,可能会将整个系统的资源全部耗尽,影响其它程序的运行,因此还可以借助其它技术来限制并发执行的进程数量。
Shell脚本中的多任务并发执行需求实现一个脚本能够使用ping检测网络的连通性可以同时检测多个IP地址, 并且将检测结果输出分析正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令。例如:#!/bin/bashfor i in {1..10};do echo $i doneecho "END"结果如下:12345678...
shell脚本的并发Default模式下,shell命令是阻塞执行的,可以通过其后添加&让这条命令异步执行,如:sleep 10 &执行这条命令后,并不会阻塞10秒,而是立即返回。如果将这种方法用在while循环中,则可以实现多进程并行处理。例如一下test1.sh文件为:#!/bin/bash
while read line
command 1
donecommand 2这样
CentOS7下多条命令可以放在一行上面执行,其执行情况得依赖于在命令之间的分隔符。
如果每条命令被一个分号 (;) 分隔,无论中间是否有错误的命令,命令会连续的执行下去,直到执行完毕,如:
[root@node1 ~]# printf "%s\n" "First command" ; date ; printf "%s\n" "Third command"
First command
Mon Oct 19 10:28:31 CST 2020
Third command
[root@node1 ~]
如何批量自动ping特定网段
不知道大家有没有遇到过这种场景,特别是驻场过的同学,应该有遇到过。客户A说:黄工啊,刚才发了一个IP地址的excel表格,帮忙ping一下,哪些地址是不通的,哪些地址是通的?
然后,你打开表格,一看:
几百个IP地址,要让我ping一下!!!! 这是要整死我的节奏吗?让我哭一会儿。到了中午,别人都去吃饭了,我只能一个个在那边ping咯?
大家看到本期文章,以上情况,再也不会出现啦~ 教你们一条命令,下次客户再甩过来,你就可以嘚瑟了。
在CMD,命令行.
个人介绍:男,搞底層的FW,喜歡發一點沒用的東西。
程序设计语言通常不构成安全风险,风险是由程序员带来的。几乎每种语言都有某些缺陷,这些缺陷在某种程度上可能有助于创建不安全的软件,但软件的整体安全性仍然在很大程度上取决于开发者的安全意识。Perl也有安全“陷阱”,然而大多数Perl程序员并不了解这些陷阱。
在本文中,我们将介绍一些被广泛误用和忽视的Perl特性。本文将展示perl语言不正确的使用方式,错误使用方式又是如何对运行程序的用户,及系统构成威胁。本文也会展示如何利用这些漏洞,
前情概要:拥有多块GPU,需要跑多个模型测试baseline
所以需要同时跑多个训练代码,使用shell脚本和python的argparse库解析参数是最方便的。
1.argparse解析参数
现在看下可选参数的用法,所谓可选参数,也就是命令行参数是可选的
# -*- coding: utf-8 -*-
import argparse
parser = argparse.ArgumentPar...
在Linux shell中,可以使用以下几种方法来模拟多进程并发执行:
1. &符号:在命令后面加上&符号可以将该命令放入后台执行,不阻塞当前终端。例如,执行命令`command &`,该命令就会在后台执行。
2. nohup命令:nohup命令可以让命令在后台运行,并且忽略挂起信号,即使关闭终端也不会中止命令的执行。例如,执行命令`nohup command &`,该命令就会在后台执行。
3. xargs命令:xargs命令可以从标准输入读取参数,并将其作为命令的参数执行。使用-xargs可以实现并发执行多个命令。例如,执行命令`echo arg1 arg2 arg3 | xargs -n 1 -P 3 command`,该命令会并发执行3个命令,每个命令的参数分别是arg1、arg2和arg3。
4. parallel命令:parallel命令可以并行执行多个命令,并且可以指定执行的进程数。例如,执行命令`parallel -j 4 command ::: arg1 arg2 arg3`,该命令会并发执行4个命令,每个命令的参数分别是arg1、arg2和arg3。
以上是一些常用的方法,可以实现在Linux shell中模拟多进程并发执行。
【Kubernetes】菜鸟学K8S之初步入门
【AI理论学习】提示学习中常见的Prompt方法
m0_63037953:
【PaperReading】HGT:Heterogeneous Graph Transformer
CSDN-Ada助手: