Memcached startup files for Red Hat (RHEL)

From Dev411: The Code Wiki

Memcached is a distributed memory cache server originally desiged for LiveJournal. Memcached is open source and available on the Danga site (http://www.danga.com/memcached/). The distribution comes with an init file and starter Perl script for Debian. Here are some versions for Red Hat (RHEL, Fedora), CentOS and like distributions.

memcached-init

Put this script in the /etc/init.d directory. Then you can access it through chkconfig.

#!/bin/bash
#
# memcached    This shell script takes care of starting and stopping
#              standalone memcached.
#
# chkconfig: - 80 12
# description: memcached is a high-performance, distributed memory
#              object caching system, generic in nature, but
#              intended for use in speeding up dynamic web
#              applications by alleviating database load.
# processname: memcached
# config: /etc/memcached.conf

# Source function library.
. /etc/rc.d/init.d/functions

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/memcached
DAEMONBOOTSTRAP=/usr/local/bin/start-memcached
DAEMONCONF=/etc/memcached.conf
NAME=memcached
DESC=memcached
PIDFILE=/var/run/$NAME.pid

[ -x $DAEMON ] || exit 0
[ -x $DAEMONBOOTSTRAP ] || exit 0

RETVAL=0

start() {
	echo -n $"Starting $DESC: "
	daemon $DAEMONBOOTSTRAP $DAEMONCONF
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch $PIDFILE
	echo
	return $RETVAL
}

stop() {
	echo -n $"Shutting down $DESC: "
	killproc $NAME
	RETVAL=$?
	echo
	[ $RETVAL -eq 0 ] && rm -f $PIDFILE
	return $RETVAL
}

# See how we were called.
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart|reload)
		stop
		start
		RETVAL=$?
		;;
	status)
		status $prog
		RETVAL=$?
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|status}"
		exit 1
esac

exit $RETVAL

start-memcached

This is a Perl bootstrap script used by the init script.

#!/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";
}