Я делал это неоднократно и обычно просто создаю свой собственный сценарий для выполнения этой работы с управлением заданиями. В общем случае, если у вас есть имена всех скриптов, которые вы хотите запустить в файле, решение выглядит так:
#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
NUM=$((NUM+1))
ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
if [ $NUM -ge $MAX_PROCS ];then
echo "Waiting for $NUM processes to finish."
wait
NUM=0
fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit
Это грубая сила, но эффективная. К тому же вам не нужно добавлять в систему дополнительное программное обеспечение типа parallel.
Большой проблемой является то, что команда wait будет ждать завершения самого медленного сценария, что может привести к потере времени. Я создал сценарии для решения этой проблемы, но, как вы можете себе представить, они становятся более сложными. Если все ваши сценарии выполняются примерно за одинаковое время, это работает хорошо.
Другая проблема заключается в том, что вам, возможно, придется настраивать MAX_PROCS, чтобы определить наилучшую производительность.
Конечно, количество ssh-соединений может стать громоздким. В этом случае просто переместите этот сценарий на удаленный хост и измените строку "ssh...", чтобы просто запускать сценарии напрямую.
sed -En 'h;:a;s/^(.)\1+//;ta;/^$/{x;p}' file
с комментариями
sed -E -n '
h # store a copy of the line
:a # set label "a"
s/^(.)\1+// # from the start of the line, remove sequences of 2 or more repeated chars
ta # *if the pattern matched* jump to "a"
/^$/ { # if empty string:
x # retrieve the original line
p # and print it
}
' file
Одним из способов, использующих Gnu sed, может быть:
sed -Ee '/^((.)\2+)+$/!d' input.txt