[systemd-devel] sd_watchdog_enabled: how to use when forking process?
philip is hungry
philipishungry at yahoo.com
Fri Jan 19 17:22:51 UTC 2018
I am trying to use "sd_watchdog_enabled". If I run my service without forking, the sd_watchdog_enabled function works as expected:
Jan 18 15:05:29 thinkpad systemd[1]: Starting WaitonlyServer...
Jan 18 15:05:30 thinkpad waitonly[11172]: PID before fork = 11172
Jan 18 15:05:30 thinkpad waitonly[11172]: Return from lockme = 0
Jan 18 15:05:30 thinkpad waitonly[11172]: PID to compare with watchdog_pid: 11172
Jan 18 15:05:30 thinkpad waitonly[11172]: Return from watchdog = 1
however if i run the forkme function (to put process in the background) it behaves as follows:
Jan 18 15:06:25 thinkpad waitonly[11228]: Return from forkme = 11228
Jan 18 15:06:25 thinkpad waitonly[11228]: Return from lockme = 0
Jan 18 15:06:25 thinkpad waitonly[11228]: PID to compare with watchdog_pid: 11228
Jan 18 15:06:25 thinkpad waitonly[11228]: systemd watchdog not enabled - not sending watchdog keepalives!
Jan 18 15:06:25 thinkpad waitonly[11228]: systemd watchdog pid = -1905553534
Jan 18 15:06:25 thinkpad waitonly[11228]: Return from watchdog = 0
where am I going wrong? any help with this is greatly appreciated.
thanks!
main.c -------------------------------------------------------------------
pid_t pid;
int watchdogInfo = 0;
int ret;
int main() {
setlogmask (LOG_UPTO (LOG_INFO));
openlog (NULL, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
pid = getpid();
syslog (LOG_NOTICE, "PID before fork = %d", pid);
ret = forkme();
syslog (LOG_NOTICE, "Return from forkme = %d", ret);
ret = lockme();
syslog (LOG_NOTICE, "Return from lockme = %d", ret);
pid = getpid();
syslog (LOG_NOTICE, "PID after fork = %d", pid);
watchdogInfo = systemd_get_watchdog_time();
syslog (LOG_NOTICE, "Return from watchdog = %d", watchdogInfo);
for (;;) { // Run forever
sleep(10);
syslog (LOG_NOTICE, "Service Running...");
}
}
forkme.c -------------------------------------------------------------------
pid_t pid;
int forkme(void) {
if ((pid = fork()) < 0)
exit(1);
else if(pid != 0) /* parent */
exit(0);
setsid();
}
lockme.c -------------------------------------------------------------------
#define LOCKFILE "/var/run/waitonly.pid"
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
int lockme(void)
{
int fd;
char buf[16];
fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);
if (fd < 0) {
syslog(LOG_ERR, "can’t open %s: %s", LOCKFILE, strerror(errno));
exit(1);
}
ftruncate(fd, 0);
sprintf(buf, "%ld", (long)getpid());
write(fd, buf, strlen(buf)+1);
return(0);
}
systemd.c -------------------------------------------------------------------
// return watchdog - 0 means that watchdog is not enabled
int systemd_get_watchdog_time(void)
{
uint64_t usec;
char *watchdog = NULL;
char *watchdog_pid = NULL;
int ret;
ret = sd_watchdog_enabled(0, &usec);
if (ret == 0) {
syslog (LOG_NOTICE, "systemd watchdog not enabled - not sending watchdog keepalives!");
watchdog_pid = getenv("WATCHDOG_PID");
syslog (LOG_NOTICE, "systemd watchdog pid = %d", watchdog_pid);
}
if (ret < 0) {
syslog (LOG_NOTICE, "systemd watchdog returned error %d - not sending watchdog keepalives", ret);
}
}
waitonly.service -------------------------------------------------------------------
[Unit]Description=WaitonlyServer
After=syslog.target networking.service
OnFailure=heartbeat-failed@%n.service
[Service]
Nice=-5
Type=forking
NotifyAccess=all
StartLimitInterval=3m
StartLimitBurst=3
TimeoutSec=1m
WatchdogSec=60s
PIDFile=/var/run/waitonly.pid
RestartSec=5
Restart=on-abnormal
LimitNOFILE=1024
ExecStart=/usr/bin/waitonly
ExecStop=/usr/bin/kill $MAINPID
ExecReload=/usr/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20180119/6d87c596/attachment-0001.html>
More information about the systemd-devel
mailing list