Запустите сервер в фоновом режиме, запустите код и снова остановите сервер в одном скрипте

#bash

#bash

Вопрос:

Я хочу создать скрипт bash, который запускает сервер, ожидает запуска сервера, затем запускает некоторый код (который обрабатывается сервером) и, наконец, снова останавливает сервер.

Вот что у меня есть, с замечаниями о том, почему это не работает:

 #!/bin/bash

# Expected: Start the local selenium server and push it to the background.
# Actual: Script continues instantly without waiting for the server to start!
selenium-server -port 4444 amp;

# Expected: Run the tests, which require the local selenium server to be started
# Actual: Tests fail because the server is not ready.
phpunit tests/ui-tests.php

# Expected: Exiting the process also stops the background job (server).
# Actual: The server continues running interactively in the terminal until stopped via Ctrl-C.
exit
  

Какой правильный (или лучший) подход для такого сценария?

Комментарии:

1. не существует понятия «перейти в фоновый режим и ждать запуска указанного процесса», хотя бы потому, что ОС понятия не имеет, что означает «запуск» (например, простой веб-сервер может запуститься и быть готов к обработке в течение 2 секунд, в то время как запуск большого сервера баз данных может занять несколько часоввверх (наихудший сценарий); перед запуском вашей phpunit команды вам нужно будет добавить шаг либо а) sleep в течение XX секунд (выберите число, которое, как вы уверены, гарантирует запуск сервера), либо б) напишите небольшой цикл / процесс опроса, чтобы периодически проверять доступность сервера в режиме ожидания(т. Е., Это «вверх»)

Ответ №1:

Вот рабочий скрипт, который я создал на основе отзывов markp-fuso:

 #!/bin/bash

start_server() {
    echo "Start server ..."
    selenium-server -port 4444 amp;
    server_pid=$!

    # Wait for the server to start (max 10 seconds)
    for attempt in {1..10}; do
        my_pid=$(lsof -t -i tcp:4444)

        if [[ -n $my_pid ]]; then
            # Make sure the running server is the one we just started.
            if [[ $my_pid -ne $server_pid ]]; then
                echo "ERROR: Multiple Selenium Servers running."
                echo "→ lsof -t -i tcp:4444 | xargs kill"
                exit 1
            fi

            break
        fi

        sleep 1
    done

    if [[ -z $my_pid ]]; then
        echo "ERROR: Timeout while waiting for Selenium Server"
        exit 1
    fi
}

stop_server() {
    echo "Stop Server ..."
    kill $server_pid
}

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

start_server

phpunit tests/ui-tests.php

stop_server
  

Комментарии:

1. ПРИМЕЧАНИЕ : я не знаком с selenium-server so fwiw… достаточно lsof/tcp:4444 ли теста для проверки работоспособности сервера? может быть, имеет смысл запустить небольшой / выборочный «запрос» (например, phpunit <test_query> ), чтобы убедиться, что он не только прослушивает порт (tcp) 4444, но также а) принимает соединения и б) возвращает ожидаемое значение из <test_query> … ? [например, я работаю с базой данных (Sybase)серверов и существования прослушивателя, работающего с портом, недостаточно, чтобы гарантировать, что сервер работает на 100%, не говоря уже о том, что я могу подключиться к нужной базе данных и выполнить запрос]

2. Это очень хороший момент! В моих текущих тестах проверки порта достаточно, поскольку для запуска сервера требуется ~ 1 сек. Насколько я понимаю, selenium — это очень легкий HTTP-сервер, который всегда должен запускаться быстро (это тестовая среда, которая получает только «локальный трафик»).). Возможно, я добавлю дополнительный sleep 1 в конце start_server 😉