我有一个用java编写的tcp/ip侦听器,它为多个"站点"运行,每个站点都有自己的端口。编写这个侦听器的开发人员是作为一个独立的开发人员来完成的,所以我必须通过start_comtrol.sh脚本来管理每个侦听器,这非常乏味。我是perl的新手,但我今天写了一个快速脚本来检查每个pidfilecompare,以确保进程正在运行,如果没有,请尝试重新启动,如下所示。
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 $pidn"; #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,并且不会移动到sites数组中的下一个变量。
The running process for FOO is 19401
The running process for BAR is 1228
[root@isildur]# nohup: appending output to `nohup.out'
处理这个问题的最佳方法是什么,这样它就不会挂在nohup的无关提示上?
您要查找的是system()
函数,而不是exec()
来自exec()
:的文档
exec函数执行系统命令,并且从不返回;使用system,而不是exec。
请尝试执行system( $start_comtrol )
。