Ich habe eine Bash-Funktion, die prüft, ob auf Servern Prozesse ausgeführt werden, indem sie deren IPs einzeln aus einer Textdatei liest
while read IP
do
if [ 1 -eq "$(echo "$(ssh -n ubuntu@$IP "top -b -n2 -d 0.5|grep Cpu|awk '{print \$2+\$4}'|tail -n1") > 1.0" | bc)" ];then
echo "process is running on $IP"
else
echo "process is not running on $IP"
fi
done < file.ips
file.ips enthält einige Server-IPs
202.X.X.X
203.X.X.X
204.X.X.X
...
...
...
Ich möchte diese Funktion ändern, um den Prozess zu überprüfen, der auf mehreren Servern parallel läuft
Antwort1
Mit GNU Parallel können Sie Folgendes tun:
check() {
IP="$1"
if [ 1 -eq "$(echo "$(ssh -n ubuntu@$IP "top -b -n2 -d 0.5|grep Cpu|awk '{print \$2+\$4}'|tail -n1") > 1.0" | bc)" ];then
echo "process is running on $IP"
else
echo "process is not running on $IP"
fi
}
export -f check
parallel -j0 check < file.ips
Antwort2
Wie wäre es, den Inhalt der Schleife im Hintergrund auszuführen?
while read IP
do
(if [ 1 -eq "$(echo "$(ssh -n ubuntu@$IP "top -b -n2 -d 0.5|grep Cpu|awk '{print \$2+\$4}'|tail -n1") > 1.0" | bc)" ];then
echo "process is running on $IP"
else
echo "process is not running on $IP"
fi) &
done < file.ips