运行几个bash命令并在一段时间后终止它们

时间:2016-12-22 19:57:54

标签: bash

我正在编写一个脚本,我从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循环吗?或者,当我更换它时,我还做了别的什么吗?

0 个答案:

没有答案