1

У меня есть служба, которая использует уникальный порт, указанный пользователем для удаленных подключений. Я установил несколько экземпляров этого сервиса и написал скрипт bash для автоматизации установки. У моего установщика есть встроенная проверка, чтобы моя собственная глупость не пыталась привязаться к портам, уже настроенным на ранее установленных экземплярах. Ранее я использовал lsof вот так ...

if [[ -z $(lsof -i :${service_port}) ]]; then

Работал отлично, пока я не понял, что иногда я переключаю экземпляры на периоды времени, а lsof проверяет только используемые порты.

Так что теперь я возвращаюсь к очистке файлов конфигурации (круто? не более lsof зависимости) каждого экземпляра, который является маленьким только приблизительно 5 КБ каждый, чтобы быстро пройти через.

Я попробовал это изначально (каждая установка находится в отдельной папке в 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

Но это срабатывает в каждом каталоге, конечно. Есть ли способ сделать эту запись только один раз, не делая сэндвич цикла while или, возможно, другую команду, которая не должна искать хотя бы все файлы?

1 ответ1

1

Догадаться... Просто нужно было использовать флаг -c для подсчета совпадений в grep, -q, чтобы он оставался чистым и тихим, затем выйдите из цикла for и убедитесь, что совпадений нет.

installs_dir="/my/dir"
while read -e -p "Service Port: " -i "" service_port; do
    s=0
    for each_install in "${installs_dir}/"*; do
        while grep -cq Port=${service_port} ${each_install}/main.cfg; do
            let "s++"
            break
        done
    done
    [ ${s} != 0 ] && printf "A server is already assigned to that port, try again.\n"
    [ ${s} == 0 ] && printf "Port assigned.\n" && break
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .