[collectd] [PATCH] collectdmon: Added SIGHUP handler to restart collectd.

Sebastian Harl sh at tokkee.org
Sun Nov 25 15:33:15 CET 2007


This might be useful for init scripts and the like to restart the collectd
process only.

Signed-off-by: Sebastian Harl <sh at tokkee.org>
---
 src/collectdmon.c |   33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/collectdmon.c b/src/collectdmon.c
index 39dc0f2..0295ad3 100644
--- a/src/collectdmon.c
+++ b/src/collectdmon.c
@@ -54,7 +54,8 @@
 # define WCOREDUMP(s) 0
 #endif /* ! WCOREDUMP */
 
-static int loop = 0;
+static int loop    = 0;
+static int restart = 0;
 
 static char  *pidfile      = NULL;
 static pid_t  collectd_pid = 0;
@@ -202,11 +203,22 @@ static void sig_int_term_handler (int signo)
 	return;
 } /* sig_int_term_handler */
 
+static void sig_hup_handler (int signo)
+{
+	++restart;
+	return;
+} /* sig_hup_handler */
+
 static void log_status (int status)
 {
 	if (WIFEXITED (status)) {
-		syslog (LOG_INFO, "Info: collectd terminated with exit status %i",
-				WEXITSTATUS (status));
+		if (0 == WEXITSTATUS (status))
+			syslog (LOG_INFO, "Info: collectd terminated with exit status %i",
+					WEXITSTATUS (status));
+		else
+			syslog (LOG_WARNING,
+					"Warning: collectd terminated with exit status %i",
+					WEXITSTATUS (status));
 	}
 	else if (WIFSIGNALED (status)) {
 		syslog (LOG_WARNING, "Warning: collectd was terminated by signal %i%s",
@@ -312,6 +324,13 @@ int main (int argc, char **argv)
 		return 1;
 	}
 
+	sa.sa_handler = sig_hup_handler;
+
+	if (0 != sigaction (SIGHUP, &sa, NULL)) {
+		syslog (LOG_ERR, "Error: sigaction() failed: %s", strerror (errno));
+		return 1;
+	}
+
 	sigaddset (&sa.sa_mask, SIGCHLD);
 	if (0 != sigprocmask (SIG_BLOCK, &sa.sa_mask, NULL)) {
 		syslog (LOG_ERR, "Error: sigprocmask() failed: %s", strerror (errno));
@@ -329,7 +348,7 @@ int main (int argc, char **argv)
 		assert (0 < collectd_pid);
 		while ((collectd_pid != waitpid (collectd_pid, &status, 0))
 				&& (EINTR == errno))
-			if (0 != loop)
+			if ((0 != loop) || (0 != restart))
 				collectd_stop ();
 
 		collectd_pid = 0;
@@ -337,7 +356,11 @@ int main (int argc, char **argv)
 		log_status (status);
 		check_respawn ();
 
-		if (0 == loop)
+		if (0 != restart) {
+			syslog (LOG_INFO, "Info: restarting collectd");
+			restart = 0;
+		}
+		else if (0 == loop)
 			syslog (LOG_WARNING, "Warning: restarting collectd");
 	}
 
-- 
1.5.3.6.736.gb7f30

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mailman.verplant.org/pipermail/collectd/attachments/20071125/e8d53d62/attachment.pgp 


More information about the collectd mailing list