public
Description: Memcached -- you all use it. Get it here.
Homepage: http://www.danga.com/memcached/
Clone URL: git://github.com/dustin/memcached.git
memcached / scripts / start-memcached
100755 118 lines (92 sloc) 2.305 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/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 $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 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)
{
    reopen_logfile($fd_reopened);
    exec "$memcached $params";
    exit(0);
 
}else{
  if(open PIDHANDLE,">$pidfile")
  {
    print PIDHANDLE $pid;
    close PIDHANDLE;
  }else{
 
    print STDERR "Can't write pidfile to $pidfile.\n";
  }
}