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
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel