Я хочу создать сценарий для последовательного запуска двух разных сценариев.
Первый скрипт запускает сервер приложений, который, хотя процесс уже запущен (и я вернулся к подсказке), он будет принимать соединение только после «определенного» сообщения в своем журнале; «Сервер Бла Бла запущен!».
Второй важный сценарий подключается к серверу и выполняет некоторые дополнительные действия.
Как я могу создать сценарий запуска, чтобы второй сценарий запускался только после первого?
./script1 && ./script2
&& означает «выполнить вторую часть только после успешного завершения первой части, в отличие от:
./script1; ./script2
Что делает первую часть, затем вторую часть. По сути, без разветвления или многопоточности (некоторые методы имеют это по своей сути), почти все программирование, которое вы делаете, является обязательным и выполняет одно (до конца) за раз. Если вам нужно удерживать, напишите WHILE на вашем языке, который будет повторяться до тех пор, пока (любое условие) не станет истинным.
#!/usr/bin/perl
# Start the first script
$first_script = `/script1.sh`;
$string_to_find = 'Server Blah Blah started';
$string_not_found = 1;
while($string_not_found){
$last_line = `tail -1 /my/app/log/file.out`;
if($last_line =~ /$string_to_find/ig) {
$string_not_found = 0;
}else {
# sleep a little
sleep 1;
}
}
# By the time we are here we are good to go with the next script.
$second_script = `/script2.sh`;
print 'Finished';
exit;
#TODO: Add some sort of counter to abort incase we don't get the string we are searching.
Пример того, как вы будете делать то, что хотите, в Perl.
#!/usr/bin/perl
use strict;
use warnings;
# Start the first script
my $first_script = `/script1.sh`;
my $string_to_find = 'Server Blah Blah started';
my $string_not_found = 1;
my $counter = 0; # counter ofcourse start at 0
my $timer = 300; # since your sleep is set for 1 second this will
# count to 300 before exiting
while($string_not_found){
exit if ($counter > $timer); # this will make the application exit
# if the give timer is hit
# you can aswell replace it by
# $string_not_found = 0 if...
# if you want it to run the 2nd code
# as an attempt instead of only exiting
my $last_line = `tail -1 /my/app/log/file.out`;
if($last_line =~ /$string_to_find/ig) {
$string_not_found = 0;
}else {
# sleep a little
$counter++;
sleep 1;
}
}
# By the time we are here we are good to go with the next script.
my $second_script = `/script2.sh`;
print 'Finished';
exit;
С приведенным выше кодом он будет запускать вторую программу только в том случае, если слово было найдено после того, как первая программа завершила его печать.
ОБНОВИТЬ: Если программа не выводит то, что вы хотите, но есть файл журнала, в который будет записана нужная вам информация, вы также можете использовать ее в Perl, чтобы не иметь никаких ограничений.