0

我有一个用 java 编写的 tcp/ip 侦听器,它为多个“站点”运行,每个站点都有自己的端口。编写此侦听器的开发人员是独立执行的,因此我必须通过一个相当乏味的 start_comtrol.sh 脚本来管理每个。我是 perl 的新手,但我今天写了一个快速脚本来检查每个 pidfile 比较,以确保进程正在运行,如果没有,则尝试重新启动,如下所示。

use strict;
use warnings;

my @sites = qw / FOO BAR FOO2 /;

foreach (@sites) {
    my $pidfile = "/usr/local/sbin/listener/$_/pid.file";
    my $start_comtrol = "/usr/local/sbin/listener/$_/start_comtrol.sh";
    open my $file, '<', $pidfile or die 'Could not open file:  ' . $!;
    my $pid = do { local $/; <$file> };
    close $file;
    my $exists = kill 0, $pid;
        if ( $exists ) {
            print "The running process for $_ is $pid\n"; #temp print to screen for debugging
            # Do Nothing
        }
        else {
            exec $start_comtrol;
    }
}

每个 start_comtrol.sh 脚本的内容都是相同的:

#!/bin/ksh
export CLASSPATH=.:ojdbc6.jar:Base.jar:ojdbc14.jar:log4j.jar
#export CLASSPATH=/home/aspira/controller/ojdbc6.jar:/home/aspira/controller/Base.jar:/home/aspira/controller/ojdbc14.jar
nohup java com.aspira.comtrol.listener.BaseListener  &
echo "$!" > pid.file

当发现进程正在运行时,脚本运行得很好,但是如果进程没有运行并且它尝试通过 exec $start_comtrol.sh 启动它,它会遇到 nohup 等待回车并且不会移动到下一个变量在站点数组中。

The running process for FOO is 19401

The running process for BAR is 1228

[root@isildur]# nohup: appending output to `nohup.out'

处理这个问题的最佳方法是什么,这样它就不会挂在 nohup 的无关提示上?

4

1 回答 1

1

您正在寻找system()功能,而不是exec()

来自文档exec()

exec 函数执行系统命令并且永不返回;如果您希望它返回,请使用 system 而不是 exec 。

尝试做system( $start_comtrol )

于 2013-07-10T20:26:44.193 回答