pidfile support
This commit is contained in:
parent
1827e1a6a1
commit
7f6e90e6b3
5
Makefile
5
Makefile
@ -10,13 +10,15 @@ CONFIG_DIR = /usr/local/etc
|
|||||||
PLUGIN_DIR = /usr/local/lib/sammler
|
PLUGIN_DIR = /usr/local/lib/sammler
|
||||||
DATA_DIR = /var/lib/sammler
|
DATA_DIR = /var/lib/sammler
|
||||||
LOG_DIR = /var/log
|
LOG_DIR = /var/log
|
||||||
|
PID_DIR = /var/run
|
||||||
WWW_DIR = /var/www
|
WWW_DIR = /var/www
|
||||||
WWW_CONFIG = $(WWW_DIR)/sammler_graph.conf
|
WWW_CONFIG = $(WWW_DIR)/sammler_graph.conf
|
||||||
WWW_OWNER = www-data
|
WWW_OWNER = www-data
|
||||||
|
|
||||||
# ############################
|
# ############################
|
||||||
|
|
||||||
SRC := sammler.c configfile.c event.c helper.c logging.c network.c plugins.c probe.c sockaddr.c
|
SRC := configfile.c event.c helper.c logging.c network.c pidfile.c plugins.c probe.c
|
||||||
|
SRC += sammler.c sockaddr.c
|
||||||
CFLAGS := -O2 -Wall -MMD -fno-stack-protector -I.
|
CFLAGS := -O2 -Wall -MMD -fno-stack-protector -I.
|
||||||
LDFLAGS := -ldl -rdynamic
|
LDFLAGS := -ldl -rdynamic
|
||||||
|
|
||||||
@ -67,6 +69,7 @@ install: all
|
|||||||
install -D -m 755 -s $(TARGET) $(DESTDIR)$(BINARY_DIR)/$(TARGET)
|
install -D -m 755 -s $(TARGET) $(DESTDIR)$(BINARY_DIR)/$(TARGET)
|
||||||
install -D -m 644 sammler.conf $(DESTDIR)$(CONFIG_DIR)/sammler.conf
|
install -D -m 644 sammler.conf $(DESTDIR)$(CONFIG_DIR)/sammler.conf
|
||||||
sed -i -e "s:^logfile .*$$:logfile $(LOG_DIR)/sammler.log:" \
|
sed -i -e "s:^logfile .*$$:logfile $(LOG_DIR)/sammler.log:" \
|
||||||
|
-e "s:^pidfile .*$$:pidfile $(PID_DIR)/sammler.pid:" \
|
||||||
-e "s:^rrd_dir .*$$:rrd_dir $(DATA_DIR):" \
|
-e "s:^rrd_dir .*$$:rrd_dir $(DATA_DIR):" \
|
||||||
-e "s:^plugin_dir .*$$:plugin_dir $(PLUGIN_DIR):" \
|
-e "s:^plugin_dir .*$$:plugin_dir $(PLUGIN_DIR):" \
|
||||||
$(DESTDIR)$(CONFIG_DIR)/sammler.conf
|
$(DESTDIR)$(CONFIG_DIR)/sammler.conf
|
||||||
|
71
pidfile.c
Normal file
71
pidfile.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include "logging.h"
|
||||||
|
|
||||||
|
int pidfile_create(const char *filename)
|
||||||
|
{
|
||||||
|
int fd = open(filename, O_CREAT | O_EXCL | O_RDWR, 0644);
|
||||||
|
if (fd < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
char buf[8];
|
||||||
|
int len = snprintf(buf, sizeof(buf), "%d", getpid());
|
||||||
|
write(fd, buf, len);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pidfile_remove(const char *filename)
|
||||||
|
{
|
||||||
|
return unlink(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t pidfile_check(const char *filename, int remove_stale)
|
||||||
|
{
|
||||||
|
int fd = open(filename, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
if (errno == ENOENT) {
|
||||||
|
errno = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[9];
|
||||||
|
int len = read(fd, buf, sizeof(buf) -1);
|
||||||
|
buf[len] = '\0';
|
||||||
|
|
||||||
|
char *tmp;
|
||||||
|
pid_t pid = strtol(buf, &tmp, 10);
|
||||||
|
if (len == 0 || tmp == buf)
|
||||||
|
pid = -1;
|
||||||
|
|
||||||
|
/* just return the pid */
|
||||||
|
if (!remove_stale)
|
||||||
|
return pid;
|
||||||
|
|
||||||
|
/* invalid pid, remove stale file */
|
||||||
|
if (pid == -1) {
|
||||||
|
pidfile_remove(filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if pid is still running */
|
||||||
|
if (kill(pid, 0) == 0 || errno != ESRCH) {
|
||||||
|
errno = 0;
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
pidfile_remove(filename);
|
||||||
|
return 0;
|
||||||
|
}
|
11
pidfile.h
Normal file
11
pidfile.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef _PIDFILE_H_
|
||||||
|
#define _PIDFILE_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
int pidfile_create(const char *filename);
|
||||||
|
int pidfile_remove(const char *filename);
|
||||||
|
|
||||||
|
pid_t pidfile_check(const char *filename, int remove_stale);
|
||||||
|
|
||||||
|
#endif // _PIDFILE_H_
|
18
sammler.c
18
sammler.c
@ -32,11 +32,13 @@
|
|||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "rrdtool.h"
|
#include "rrdtool.h"
|
||||||
|
#include "pidfile.h"
|
||||||
#include "plugins.h"
|
#include "plugins.h"
|
||||||
#include "probe.h"
|
#include "probe.h"
|
||||||
|
|
||||||
#define DEFAULT_CONFIG "sammler.conf"
|
#define DEFAULT_CONFIG "sammler.conf"
|
||||||
#define DEFAULT_LOGFILE "sammler.log"
|
#define DEFAULT_LOGFILE "sammler.log"
|
||||||
|
#define DEFAULT_PIDFILE "sammler.pid"
|
||||||
|
|
||||||
static struct option opts[] = {
|
static struct option opts[] = {
|
||||||
{"config", 1, 0, 'c'},
|
{"config", 1, 0, 'c'},
|
||||||
@ -88,12 +90,26 @@ int main(int argc, char *argv[])
|
|||||||
/* check logfile */
|
/* check logfile */
|
||||||
const char *logfile = config_get_string("global", "logfile", DEFAULT_LOGFILE);
|
const char *logfile = config_get_string("global", "logfile", DEFAULT_LOGFILE);
|
||||||
if (logfile != NULL && debug == 0) {
|
if (logfile != NULL && debug == 0) {
|
||||||
|
/* check pidfile */
|
||||||
|
const char *pidfile = config_get_string("global", "pidfile", DEFAULT_PIDFILE);
|
||||||
|
if (pidfile_check(pidfile, 1) != 0) {
|
||||||
|
log_print(LOG_ERROR, "sammler already running");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* start logging */
|
/* start logging */
|
||||||
if (log_init(logfile))
|
const char *logfile = config_get_string("global", "logfile", DEFAULT_LOGFILE);
|
||||||
|
if (log_init(logfile) < 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
/* zum daemon mutieren */
|
/* zum daemon mutieren */
|
||||||
daemon(-1, 0);
|
daemon(-1, 0);
|
||||||
|
|
||||||
|
/* create pidfile */
|
||||||
|
if (pidfile_create(pidfile) < 0) {
|
||||||
|
log_print(LOG_ERROR, "failed to create pidfile %s", pidfile);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_print(LOG_EVERYTIME, "sammler (pid:%d)", getpid());
|
log_print(LOG_EVERYTIME, "sammler (pid:%d)", getpid());
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
forward_only false
|
forward_only false
|
||||||
|
|
||||||
logfile sammler.log
|
logfile sammler.log
|
||||||
|
pidfile sammler.pid
|
||||||
|
|
||||||
rrd_dir rrd
|
rrd_dir rrd
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user