【发布时间】:2013-06-21 13:26:39
【问题描述】:
我正在尝试限制脚本中生成的子shell 的数量,该脚本用于嗅探我们的内部网络以审计我们网络中的 Linux 服务器。该脚本按预期工作,但由于我嵌套 for 循环的方式,它为每个网络生成 255 个子 Shell,因此由于生成了超过 1000 个进程,因此它会杀死 CPU。我需要能够限制进程的数量,并且由于变量在 Sub Shell 中会失去其价值,所以我无法找到一种方法来实现这一点。再次,该脚本有效,它只是产生大量进程 - 我需要将其限制为最多 10 个进程:
#!/bin/bash
FILE=/root/ats_net_final
for network in `cat $FILE`;do
for ip in $network.{1..255};do
(
SYSNAME=`snmpwalk -v2c -c public -t1 -r1 $ip sysName.0 2>/dev/null | awk '{ print $NF }'`
SYSTYPE=`snmpwalk -v2c -c public -t1 -r1 $ip sysDescr.0 2>/dev/null | grep -o Linux`
if [ $? -eq 0 ];then
echo "$SYSNAME"
exit 0;
else
echo "Processed $ip"
exit 0
fi
) &
done
done
This 解决方案我发现可行,但在我的情况下不行,因为无论如何,它仍然会在限制进程的逻辑之前生成进程。我想也许我只是看代码太久了,这只是一个简单的逻辑问题,我把东西放在错误的区域或错误的顺序。
已接受答案:
我已接受 huitseeker 的回答。他能够为我提供逻辑如何运作的方向,让我让它发挥作用。最终脚本:
#!/bin/bash
FILE=/root/ats_net_final
for network in `cat $FILE`;do
#for ip in $network.{1..255};do
for ip in {1..255};do
(
ip=$network.$ip
SYSNAME=`snmpwalk -v2c -c public -t1 -r1 $ip sysName.0 2>/dev/null | awk '{ print $NF }'`
SYSTYPE=`snmpwalk -v2c -c public -t1 -r1 $ip sysDescr.0 2>/dev/null | grep -o Linux`
if [ $? -eq 0 ];then
echo "$SYSNAME"
exit 0;
else
echo "Processed $ip"
exit 0
fi
) &
if (( $ip % 10 == 0 )); then wait; fi
done
wait
done
【问题讨论】:
-
使用 `255。它可以是广播地址(在
C类型网络的情况下)而不是机器地址。 -
@TrueY:虽然这是真的,但我这样做是为了处理。在我们的网络中,我们使用 /24,确实
.0是网络,.255是广播,.1是我们的网关(对于我们所有的网络),我仍然包括它。在正常情况下,我完全同意。
标签: bash process limit subshell