Skip to content

Instantly share code, notes, and snippets.

@AoJ
Forked from hacst/CMakeLists.txt
Created December 7, 2023 20:02
Show Gist options
  • Save AoJ/0107cdd2ffce589ebdb1ac31fad9c4df to your computer and use it in GitHub Desktop.
Save AoJ/0107cdd2ffce589ebdb1ac31fad9c4df to your computer and use it in GitHub Desktop.
Basic Systemd sd_notify + watchdog usage
cmake_minimum_required(VERSION 2.8)
project(sdnotify)
add_executable(sdnotify sdnotify.cpp)
target_link_libraries(sdnotify PUBLIC systemd)
#include <systemd/sd-daemon.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
setbuf(stdout, NULL);
uint64_t watchdogIntervalInUs;
const bool watchdog = sd_watchdog_enabled(0, &watchdogIntervalInUs) > 0; // Service WatchdogSec must be set for this to return > 0
if (watchdog) {
printf("Watchdog is enabled with %lu us\n", watchdogIntervalInUs);
} else {
printf("Not running in a watchdog env\n");
return 1;
}
// To be able to use sd_notify at all have to set service NotifyAccess (e.g. to main)
sd_notify(0, "READY=1"); // If service Type=notify the service is only considered ready once we send this (this is independent of watchdog capability)
printf("Notified as ready. Now sleeping with watchdog\n");
//usleep(watchdogIntervalInUs * 2); // Should get the process killed
int i = 0;
while(true) {
usleep(watchdogIntervalInUs / 2); // Recommended reporting interval is half the watchdog interval
sd_notify(0, "WATCHDOG=1");
sd_notifyf(0, "STATUS=Watchdog notify count %d", i); // Visible in systemctl status
++i;
}
return 0;
}
[Unit]
Description=Just a test for watchdogs etc
[Service]
ExecStart=/path/to/binary/sdnotify
Type=notify
NotifyAccess=main
WatchdogSec=5s
Restart=on-failure
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment