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 関数はシステム コマンドを実行し、戻りません。戻りたい場合は、exec の代わりに system を使用してください。

system( $start_comtrol )代わりに やってみてください。

于 2013-07-10T20:26:44.193 に答える