У меня есть bash - script, который запускает некоторую службу в фоновом режиме. После того, как эта служба успешно запустится, она печатает "Сервер активен" в стандартном режиме. Мне нужно подождать, пока эта строка не появится, а затем продолжить выполнение моего script. Как я могу достичь этого?
Подождите, пока служба не запустится в bash - script
Ответ 1
Я бы сделал так.
./server > /tmp/server-log.txt &
sleep 1
while ! grep -m1 'Server is active' < /tmp/server-log.txt; do
sleep 1
done
echo Continue
Здесь -m1
сообщает grep(1)
выйти из первого совпадения.
Я ответил своим ответом своей "службой игрушек" ниже:
#! /bin/bash
trap "echo 'YOU killed me with SIGPIPE!' 1>&2 " SIGPIPE
rm -f /tmp/server-output.txt
for (( i=0; i<5; ++i )); do
echo "i==$i"
sleep 1;
done
echo "Server is active"
for (( ; i<10; ++i )); do
echo "i==$i"
sleep 1;
done
echo "Server is shutting down..." > /tmp/server-output.txt
Если вы замените echo Continue
на echo Continue; sleep 1; ls /tmp/server-msg.txt
, вы увидите ls: cannot access /tmp/server-output.txt: No such file or directory
, который докажет, что действие "Продолжить" было запущено сразу после выхода Server is active
.
Ответ 2
Мне нужно прочитать статус службы в service
приложении:
$ /sbin/service network status
network.service - Network Connectivity
Loaded: loaded (/lib/systemd/system/network.service; enabled)
Active: active (exited) since Ср 2014-01-29 22:00:06 MSK; 1 day 15h ago
Process: 15491 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)
$ /sbin/service httpd status
httpd.service - SYSV: Apache is a World Wide Web server. It is used to serve HTML files and CGI.
Loaded: loaded (/etc/rc.d/init.d/httpd)
Active: activating (start) since Пт 2014-01-31 13:59:06 MSK; 930ms ago
и это можно сделать с помощью кода:
function is_in_activation {
activation=$(/sbin/service "$1" status | grep "Active: activation" )
if [ -z "$activation" ]; then
true;
else
false;
fi
return $?;
}
while is_in_activation network ; do true; done
Ответ 3
Вы запрашиваете перенаправление stderr на stdout?
./yourscript.sh 2>&1 |grep "Server is active" && echo "continue executing my script"
Ответ 4
Используйте grep -q
. Параметр -q
делает grep
тихим, и он немедленно завершится, когда появится текст.
Приведенная ниже команда запускает ./some-service
в фоновом режиме и блокирует, пока на стандартный вывод не выводится "Сервер активен".
(./some-service &) | grep -q "Server is active"