From 1b81a2e3d6944cb55edcade1119de1cb1edbe589 Mon Sep 17 00:00:00 2001
From: Badlop
Date: Mon, 24 Aug 2009 21:21:04 +0000
Subject: [PATCH] Write PID file, path is configurable in ejabberdctl.cfg
(EJAB-1023)
SVN Revision: 2526
---
doc/guide.html | 2 ++
doc/guide.tex | 2 ++
src/ejabberd.erl | 12 ++++++++++++
src/ejabberd_app.erl | 33 +++++++++++++++++++++++++++++++++
src/ejabberdctl.cfg.example | 12 ++++++++++++
src/ejabberdctl.template | 1 +
6 files changed, 62 insertions(+)
diff --git a/doc/guide.html b/doc/guide.html
index 350964fac..ef6d24757 100644
--- a/doc/guide.html
+++ b/doc/guide.html
@@ -3378,6 +3378,8 @@ all the environment variables and command line parameters.
The environment
Path to the directory with binary system libraries.
EJABBERD_DOC_PATH
Path to the directory with ejabberd documentation.
+EJABBERD_PID_PATH
+ Path to the PID file that ejabberd can create when started.
HOME
Path to the directory that is considered ejabberd’s home.
This path is used to read the file .erlang.cookie.
diff --git a/doc/guide.tex b/doc/guide.tex
index 924ad2478..8d4f257a4 100644
--- a/doc/guide.tex
+++ b/doc/guide.tex
@@ -4327,6 +4327,8 @@ The environment variables:
Path to the directory with binary system libraries.
\titem{EJABBERD\_DOC\_PATH}
Path to the directory with ejabberd documentation.
+ \titem{EJABBERD\_PID\_PATH}
+ Path to the PID file that ejabberd can create when started.
\titem{HOME}
Path to the directory that is considered \ejabberd{}'s home.
This path is used to read the file \term{.erlang.cookie}.
diff --git a/src/ejabberd.erl b/src/ejabberd.erl
index 0c7c56a2a..228614b93 100644
--- a/src/ejabberd.erl
+++ b/src/ejabberd.erl
@@ -28,6 +28,7 @@
-author('alexey@process-one.net').
-export([start/0, stop/0,
+ get_pid_file/0,
get_so_path/0, get_bin_path/0]).
start() ->
@@ -63,3 +64,14 @@ get_bin_path() ->
Path ->
Path
end.
+
+%% @spec () -> false | string()
+get_pid_file() ->
+ case os:getenv("EJABBERD_PID_PATH") of
+ false ->
+ false;
+ "" ->
+ false;
+ Path ->
+ Path
+ end.
diff --git a/src/ejabberd_app.erl b/src/ejabberd_app.erl
index 80e8ca766..8c97394c2 100644
--- a/src/ejabberd_app.erl
+++ b/src/ejabberd_app.erl
@@ -40,6 +40,7 @@
start(normal, _Args) ->
ejabberd_loglevel:set(4),
+ write_pid_file(),
application:start(sasl),
randoms:start(),
db_init(),
@@ -81,6 +82,7 @@ prep_stop(State) ->
%% All the processes were killed when this function is called
stop(_State) ->
?INFO_MSG("ejabberd ~s is stopped in the node ~p", [?VERSION, node()]),
+ delete_pid_file(),
ejabberd_debug:stop(),
ok.
@@ -194,3 +196,34 @@ add_windows_nameservers() ->
IPTs = win32_dns:get_nameservers(),
?INFO_MSG("Adding machine's DNS IPs to Erlang system:~n~p", [IPTs]),
lists:foreach(fun(IPT) -> inet_db:add_ns(IPT) end, IPTs).
+
+
+%%%
+%%% PID file
+%%%
+
+write_pid_file() ->
+ case ejabberd:get_pid_file() of
+ false ->
+ ok;
+ PidFilename ->
+ write_pid_file(os:getpid(), PidFilename)
+ end.
+
+write_pid_file(Pid, PidFilename) ->
+ case file:open(PidFilename, [write]) of
+ {ok, Fd} ->
+ io:format(Fd, "~s~n", [Pid]),
+ file:close(Fd);
+ {error, Reason} ->
+ ?ERROR_MSG("Cannot write PID file ~s~nReason: ~p", [PidFilename, Reason]),
+ throw({cannot_write_pid_file, PidFilename, Reason})
+ end.
+
+delete_pid_file() ->
+ case ejabberd:get_pid_file() of
+ false ->
+ ok;
+ PidFilename ->
+ file:delete(PidFilename)
+ end.
diff --git a/src/ejabberdctl.cfg.example b/src/ejabberdctl.cfg.example
index 0c8d0c5a6..1ba413fe2 100644
--- a/src/ejabberdctl.cfg.example
+++ b/src/ejabberdctl.cfg.example
@@ -110,6 +110,18 @@
#
#ERLANG_NODE=ejabberd
+#.
+#' EJABBERD_PID_PATH: ejabberd PID file
+#
+# Indicate the full path to the ejabberd Process identifier (PID) file.
+# If this variable is defined, ejabberd writes the PID file when starts,
+# and deletes it when stops.
+# Remember to create the directory and grant write permission to ejabberd.
+#
+# Default: don't write PID file
+#
+#EJABBERD_PID_PATH=/var/run/ejabberd/ejabberd.pid
+
#.
#'
# vim: foldmarker=#',#. foldmethod=marker:
diff --git a/src/ejabberdctl.template b/src/ejabberdctl.template
index f6a30bb09..48a56ba5b 100644
--- a/src/ejabberdctl.template
+++ b/src/ejabberdctl.template
@@ -118,6 +118,7 @@ export EJABBERD_LOG_PATH
export EJABBERD_SO_PATH
export EJABBERD_BIN_PATH
export EJABBERD_DOC_PATH
+export EJABBERD_PID_PATH
export ERL_CRASH_DUMP
export ERL_INETRC
export ERL_MAX_PORTS