I don't know if it is appropriate or not, but I used the sd-bus library.
I just ask systemd if my service is running. If it is running I then
get the service's MainPID. If the mainPID matches my process pid then
I started from the systemd. If not then I didn't.
I only use it for debugging. If I started it from command line when I
debug I want logging to go to a file. If it started from systemd it
goes to journal. That is the extent of my usage.
The top level logic looks like:
const std::string systemd_destination = "org.freedesktop.systemd1";
const std::string systemd_quietwind_service_path =
"/org/freedesktop/systemd1/unit/quietwind_2eweather_2eservice";
const std::string systemd_unit_interface = "org.freedesktop.systemd1.Unit";
const std::string systemd_service_interface =
"org.freedesktop.systemd1.Service";
/*
* If we have started from systemd then we always use
* LOGGER_MODE_JOURNAL.
*/
SdUnit sd_qw_unit(systemd_destination,
systemd_quietwind_service_path,
systemd_unit_interface);
SdServiceUnit sd_qw_service_unit(systemd_destination,
systemd_quietwind_service_path,
systemd_service_interface);
service_state = sd_qw_unit.getSubState();
if (service_state.has_value() != true) {
logger.log(LOG_ERR, "Can't get substate of quietwind weather service");
exit(1);
}
service_pid = sd_qw_service_unit.getMainPID();
if (service_pid.has_value() != true) {
logger.log(LOG_ERR, "Can't get main pid of quietwind weather service");
exit(1);
}
if (service_state == "running" && service_pid == getpid()) {
in_systemd = true;
}
if (in_systemd == true) {
logger.setMode(LOGGER_MODE_JOURNAL);
logger.log(LOG_INFO, "Logging in Journal Mode");
}
It took a while to figure out the naming structure. But after that getting
properties and executing commands is not so difficult. I used these pages
to figure it out:
Information about sd-bus library can be found here.
https://www.freedesktop.org/wiki/Software/dbus/
https://www.freedesktop.org/software/systemd/man/latest/sd-bus.html
https://0pointer.net/blog/the-new-sd-bus-api-of-systemd.html
https://manpages.ubuntu.com/manpages/bionic/man1/busctl.1.html
https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.systemd1.html
Thanks
Chris
On 6/30/25 5:25 AM, Stef Bon wrote:
Hi,
it's important for a program to detect it has been started by systemd.
For example it does not have to fork since it has already been forked.
I've written a test script, which calls env, and there are a few
unique environment variables which are an indication it has been
started by systemd: SYSTEMD_EXEC_PID and INVOCATION_ID.
Is it a good way to test these environment vars (to detect started by
systemd) or is there a better way?
S. Bon