我正在尝试限制脚本中生成的子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
我发现这个解决方案有效,但不适用于我的情况,因为无论如何,它仍然会在限制进程的逻辑之前产生进程。我想也许我只是看代码太久了,这只是一个简单的逻辑问题,我把东西放在错误的区域,或者以错误的顺序。
接受的答案:
我已经接受了 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