#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
😉