Mam usługę, która wykorzystuje unikalny port określony przez użytkownika do połączeń zdalnych. Instaluję wiele instancji tej usługi i napisałem skrypt bash, aby zautomatyzować instalacje. Mój instalator ma wbudowaną funkcję sprawdzającą, która uniemożliwia mojej głupocie próbę powiązania z portami już skonfigurowanymi na wcześniej zainstalowanych instancjach. Wcześniej korzystałem z lsof tak ...
if [[ -z $(lsof -i :${service_port}) ]]; then
Pracowałam świetnie, dopóki nie zdałam sobie sprawy, że czasami wyłączam instancje na okresy czasu, a lsof sprawdza tylko aktualnie używane porty.
Więc teraz wracam do skrobania plików konfiguracyjnych (fajne? Nie więcej zależności od lsof) każdej instancji, które są małe tylko około 5kb każdy szybko się iterują.
Próbowałem tego początkowo (każda instalacja jest w swoim własnym folderze w katalogu installs_dir) ...
while read -e -p "Port: " -i "" service_port; do
for each_install in "${installs_dir}/"*
do
if grep -q Port=${service_port} "$each_install"/main.cfg; then
printf "Port ${service_port} in use, try another port\n"
break
else
# Write Config
fi
done
done
Ale oczywiście strzela w każdym katalogu. Czy istnieje sposób, aby napisać to tylko raz, bez tworzenia kanapki z pętlą while lub innej komendy, która nie musi przeszukiwać wszystkich plików?
źródło