按顺序启动 Linux 脚本并进行阻塞

按顺序启动 Linux 脚本并进行阻塞

我想创建一个脚本来按顺序启动两个不同的脚本。

第一个脚本启动了一个应用程序服务器,尽管该进程已启动(并且我已回到提示符),但它只会在其日志中出现“某些”消息后才接受连接;“服务器 Blah Blah 已启动!”。

第二个脚本主要连接到服务器并执行一些额外的操作。

我如何创建一个启动脚本,使得第二个脚本仅在第一个脚本之后启动?

答案1

一个关于如何在 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 中使用它,这样您就完全不受限制了。

答案2

./script1 && ./script2
&& 表示“仅在第一部分成功完成后才执行第二部分”,不同于:
./script1; ./script2
先执行第一部分,再执行第二部分。但本质上,如果没有分叉或线程(某些方法本身就具有这一点),您所做的几乎所有编程都是命令式的,并且一次只做一件事(直到最后)。如果您需要保持,请在您的语言中编写一个 WHILE,循环直到(无论什么条件)为真。

答案3

#!/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.

相关内容