--- /dev/null
+#!/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 POSIX qw(setsid);
+use strict;
+
+if($> != 0 and $< != 0)
+{
+ print STDERR "Only root wants to run start-memcached.\n";
+ exit;
+}
+
+my $params; my $etchandle; my $etcfile = "/etc/memcached.conf";
+
+# 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/bin/memcached";
+my $pidfile = "/var/run/memcached.pid";
+
+if (scalar(@ARGV) == 2) {
+ $etcfile = shift(@ARGV);
+ $pidfile = shift(@ARGV);
+}
+
+# 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 ||= "";
+ $line =~ s/\#.*//g;
+ $line =~ s/\s+$//g;
+ $line =~ s/^\s+//g;
+ next unless $line;
+ next if $line =~ /^\-[dh]/;
+
+ if($line =~ /^[^\-]/)
+ {
+ my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/;
+ $conf_directives->{$directive}->($arg);
+ next;
+ }
+
+ push @$params, $line;
+ }
+
+}else{
+ $params = [];
+}
+
+push @$params, "-u root" unless(grep "-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)
+{
+ # setsid makes us the session leader
+ setsid();
+ reopen_logfile($fd_reopened);
+ # must fork again now that tty is closed
+ $pid = fork();
+ if ($pid) {
+ if(open PIDHANDLE,">$pidfile")
+ {
+ print PIDHANDLE $pid;
+ close PIDHANDLE;
+ }else{
+
+ print STDERR "Can't write pidfile to $pidfile.\n";
+ }
+ exit(0);
+ }
+ exec "$memcached $params";
+ exit(0);
+
+}