⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stop.pl

📁 package of develop dns
💻 PL
字号:
#!/usr/bin/perl -w## Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")# Copyright (C) 2001  Internet Software Consortium.## Permission to use, copy, modify, and distribute this software for any# purpose with or without fee is hereby granted, provided that the above# copyright notice and this permission notice appear in all copies.## THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR# PERFORMANCE OF THIS SOFTWARE.# $Id: stop.pl,v 1.4.12.3 2004/03/08 04:04:33 marka Exp $# Framework for stopping test servers# Based on the type of server specified, signal the server to stop, wait# briefly for it to die, and then kill it if it is still alive.# If a server is specified, stop it. Otherwise, stop all servers for test.use strict;use Cwd 'abs_path';# Option handling#   [--use-rndc] test [server]##   test - name of the test directory#   server - name of the server directorymy $usage = "usage: $0 [--use-rndc] test-directory [server-directory]";my $use_rndc;while (@ARGV && $ARGV[0] =~ /^-/) {	my $opt = shift @ARGV;	if ($opt eq '--use-rndc') {		$use_rndc = 1;	} else {		die "$usage\n";	}}my $test = $ARGV[0];my $server = $ARGV[1];my $errors = 0;die "$usage\n" unless defined($test);die "No test directory: \"$test\"\n" unless (-d $test);die "No server directory: \"$server\"\n" if (defined($server) && !-d $server);    # Global variablesmy $testdir = abs_path($test);my @servers;# Determine which servers need to be stopped.if (defined $server) {	@servers = ($server);} else {	local *DIR;	opendir DIR, $testdir or die "$testdir: $!\n";	my @files = sort readdir DIR;	closedir DIR;	my @ns = grep /^ns[0-9]*$/, @files;	my @lwresd = grep /^lwresd[0-9]*$/, @files;	my @ans = grep /^ans[0-9]*$/, @files;		push @servers, @ns, @lwresd, @ans;}# Stop the server(s), pass 1: rndc.if ($use_rndc) {	foreach my $server (grep /^ns/, @servers) {		stop_rndc($server);	}	wait_for_servers(5, grep /^ns/, @servers);}# Pass 2: SIGTERMforeach my $server (@servers) {	stop_signal($server, "TERM");}wait_for_servers(5, @servers);# Pass 3: SIGABRTforeach my $server (@servers) {	stop_signal($server, "ABRT");}exit($errors ? 1 : 0);# Subroutines# Return the full path to a given server's PID file.sub server_pid_file {	my($server) = @_;	my $pid_file;	if ($server =~ /^ns/) {		$pid_file = "named.pid";	} elsif ($server =~ /^lwresd/) {		$pid_file = "lwresd.pid";	} elsif ($server =~ /^ans/) {		$pid_file = "ans.pid";	} else {		print "I:Unknown server type $server\n";		exit 1;	}	$pid_file = "$testdir/$server/$pid_file";}# Read a PID.sub read_pid {	my($pid_file) = @_;	local *FH;	my $result = open FH, "< $pid_file";	if (!$result) {		print "I:$pid_file: $!\n";		unlink $pid_file;		return;	}	my $pid = <FH>;	chomp($pid);	return $pid;}# Stop a named process with rndc.sub stop_rndc {	my($server) = @_;	return unless ($server =~ /^ns(\d+)$/);	my $ip = "10.53.0.$1";	# Ugly, but should work.	system("$ENV{RNDC} -c $testdir/../common/rndc.conf -s $ip -p 9953 stop | sed 's/^/I:$server /'");	return;}# Stop a server by sending a signal to it.sub stop_signal {	my($server, $sig) = @_;	my $pid_file = server_pid_file($server);	return unless -f $pid_file;		my $pid = read_pid($pid_file);	return unless defined($pid);	if ($sig eq 'ABRT') {		print "I:$server didn't die when sent a SIGTERM\n";		$errors++;	}	my $result = kill $sig, $pid;	if (!$result) {		print "I:$server died before a SIG$sig was sent\n";		unlink $pid_file;		$errors++;	}	return;}sub wait_for_servers {	my($timeout, @servers) = @_;	my @pid_files = grep { defined($_) }	                map  { server_pid_file($_) } @servers;	while ($timeout > 0 && @pid_files > 0) {		@pid_files = grep { -f $_ } @pid_files;		sleep 1 if (@pid_files > 0);		$timeout--;	}	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -