У меня есть прослушиватель tcp/ip, написанный на java, который запускается для нескольких «сайтов», каждый со своим собственным портом. Разработчик, написавший этот слушатель, сделал это отдельно, поэтому мне приходится управлять каждым через скрипт start_comtrol.sh, что довольно утомительно. Я новичок в Perl, но сегодня я написал быстрый скрипт для проверки каждого сравнения pid-файлов, чтобы убедиться, что процесс запущен, и попытаться перезапустить его, если это не так, как показано ниже.
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?