All pastes #832891 Raw Edit

Someone

public text v1 · immutable
#832891 ·published 2007-12-26 19:19 UTC
rendered paste body
#!/usr/bin/perl -w

# start-memcached
# 2003/2004 - Jay Bonci <jaybonci@debian.org>
# This script handles the parsing of the /etc/memcached.conf file
# and was originally created for the Debian distribution.
# Anyone may use this little script under the same terms as
# memcached itself.

use strict;

if ($> != 0 and $< != 0) {
	print STDERR "Only root wants to run start-memcached.\n";
	exit;
}

my $etcfile = shift || "/etc/memcached.conf";
my $params = [];
my $etchandle; 

# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid

my $memcached = "/usr/local/bin/memcached";
my $pidfile = "/var/run/memcached.pid";

# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for 
# the tip
my $fd_reopened = "/dev/null";

sub handle_logfile {
	my ($logfile) = @_;
	$fd_reopened = $logfile;
}

sub reopen_logfile {
	my ($logfile) = @_;
	open *STDERR, ">>$logfile";
	open *STDOUT, ">>$logfile";
	open *STDIN, ">>/dev/null";
	$fd_reopened = $logfile;
}

# This is set up in place here to support other non -[a-z] directives

my $conf_directives = {
	"logfile" => \&handle_logfile
};

if (open $etchandle, $etcfile) {
	foreach my $line (<$etchandle>) {
		$line =~ s/\#.*//go;
		$line = join ' ', split ' ', $line;
		next unless $line;
		next if $line =~ /^\-[dh]/o;

		if ($line =~ /^[^\-]/o) {
			my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/; 
			$conf_directives->{$directive}->($arg);
			next;
		}
		push @$params, $line;
	}
}

unshift @$params, "-u root" unless (grep $_ eq '-u', @$params);
$params = join " ", @$params;

if (-e $pidfile) {
	open PIDHANDLE, "$pidfile";
	my $localpid = <PIDHANDLE>;
	close PIDHANDLE;

	chomp $localpid;
	if (-d "/proc/$localpid") {
		print STDERR "memcached is already running.\n"; 
		exit;
	} else {
		`rm -f $localpid`;
	}
}

my $pid = fork();

if ($pid == 0) {
	reopen_logfile($fd_reopened);
	exec "$memcached $params";
	exit(0);
} elsif (open PIDHANDLE,">$pidfile") {
	print PIDHANDLE $pid;
	close PIDHANDLE;
} else {
	print STDERR "Can't write pidfile to $pidfile.\n";
}