我正在编写一个脚本,我从netstat获取IP地址,并根据我想为每个IP运行特定命令。此命令连接到IP并在终端中输出一些文本。如果命令无法连接,它将在大约35秒后超时,这会使脚本变慢。
以下是我要做的事情: 从netstat获取IP地址并向前管道 - 完成 对于每个IP地址,运行一个命令,例如" mycommand $ IP"但是在并列中运行它。 在X秒之后,杀死所有命令的PID。
在stackoverflow上,我找到了一个执行此操作的脚本。
#!/bin/bash
for cmd in "$@"; do {
echo "Process \"$cmd\" started";
$cmd & pid=$!
PID_LIST+=" $pid";
} done
echo "Parallel processes have started";
sleep 5
for id in $PID_LIST
do
kill $id
done
echo
echo "All processes have completed";
如果您像以下一样使用它,它会起作用:
./paralell.sh "mycommand 1.1.1.1" "mycommand 2.2.2.2" "mycommand 3.3.3.3"
我遇到的麻烦是如何获得看起来像这样的管道输入
mycommand 1.1.1.1
mycommand 2.2.2.2
mycommand 3.3.3.3
进入上面的脚本。
这一切都需要在一行上,不能使用存储的脚本。
我尝试过:
用while循环替换for循环,如
myoutput | while read cmd; do... (and the rest of the script above on one line)
然而,当我使用while循环而不是for循环时,$ PID_LIST不会在while循环之外生存。由于它是空的,我不能在20秒后杀死进程。
还有一个while循环在另一个问题上产生一个新的子shell而不是for循环吗?或者,当我更换它时,我还做了别的什么吗?