Назад | Перейти на главную страницу

Запускать скрипты Linux последовательно с блокировкой

Я хочу создать сценарий для последовательного запуска двух разных сценариев.

Первый скрипт запускает сервер приложений, который, хотя процесс уже запущен (и я вернулся к подсказке), он будет принимать соединение только после «определенного» сообщения в своем журнале; «Сервер Бла Бла запущен!».

Второй важный сценарий подключается к серверу и выполняет некоторые дополнительные действия.

Как я могу создать сценарий запуска, чтобы второй сценарий запускался только после первого?

./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, чтобы не иметь никаких ограничений.