Notify systemd when the service is ready or stopping
This commit is contained in:
parent
37ee4f8fa7
commit
d3e556cea7
|
@ -104,6 +104,17 @@ if (BOOST_ASIO_IO_URING)
|
||||||
use_pkg_config_module(PKG_CONFIG_MODULES "liburing" VISIBILITY PUBLIC)
|
use_pkg_config_module(PKG_CONFIG_MODULES "liburing" VISIBILITY PUBLIC)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# find systemd library
|
||||||
|
option(SYSTEMD_SUPPORT "enable use of libsystemd for signaling when the service is ready" ON)
|
||||||
|
if (SYSTEMD_SUPPORT)
|
||||||
|
message(STATUS "Using libsystemd")
|
||||||
|
set_property(
|
||||||
|
SOURCE serversetup.cpp webapi/server.cpp
|
||||||
|
APPEND
|
||||||
|
PROPERTY COMPILE_DEFINITIONS USE_LIBSYSTEMD)
|
||||||
|
use_pkg_config_module(PKG_CONFIG_MODULES "libsystemd" VISIBILITY PRIVATE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# find reflective-rapidjson
|
# find reflective-rapidjson
|
||||||
find_package(reflective_rapidjson${CONFIGURATION_PACKAGE_SUFFIX} REQUIRED)
|
find_package(reflective_rapidjson${CONFIGURATION_PACKAGE_SUFFIX} REQUIRED)
|
||||||
use_reflective_rapidjson(VISIBILITY PUBLIC)
|
use_reflective_rapidjson(VISIBILITY PUBLIC)
|
||||||
|
|
|
@ -35,6 +35,10 @@
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
@ -768,6 +772,10 @@ void ServiceSetup::initStorage()
|
||||||
|
|
||||||
int ServiceSetup::run()
|
int ServiceSetup::run()
|
||||||
{
|
{
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, "STATUS=Loading databases");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CPP_UTILITIES_DEBUG_BUILD
|
#ifndef CPP_UTILITIES_DEBUG_BUILD
|
||||||
try {
|
try {
|
||||||
#endif
|
#endif
|
||||||
|
@ -793,12 +801,21 @@ int ServiceSetup::run()
|
||||||
#endif
|
#endif
|
||||||
printDatabases();
|
printDatabases();
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, "STATUS=Initializing SSL");
|
||||||
|
#endif
|
||||||
cout << Phrases::SuccessMessage << "Initializing SSL" << Phrases::End;
|
cout << Phrases::SuccessMessage << "Initializing SSL" << Phrases::End;
|
||||||
webServer.initSsl();
|
webServer.initSsl();
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, "STATUS=Allocating worker thread pool");
|
||||||
|
#endif
|
||||||
cout << Phrases::SuccessMessage << "Allocating worker thread pool (thread count: " << building.threadCount << ")" << Phrases::End;
|
cout << Phrases::SuccessMessage << "Allocating worker thread pool (thread count: " << building.threadCount << ")" << Phrases::End;
|
||||||
const auto buildWorker = building.allocateBuildWorker();
|
const auto buildWorker = building.allocateBuildWorker();
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, "STATUS=Starting web server");
|
||||||
|
#endif
|
||||||
cout << Phrases::SuccessMessage << "Starting web server (thread count: " << webServer.threadCount << "):" << TextAttribute::Reset
|
cout << Phrases::SuccessMessage << "Starting web server (thread count: " << webServer.threadCount << "):" << TextAttribute::Reset
|
||||||
<< " http://" << webServer.address << ':' << webServer.port << endl;
|
<< " http://" << webServer.address << ':' << webServer.port << endl;
|
||||||
WebAPI::Server::serve(*this);
|
WebAPI::Server::serve(*this);
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
|
|
||||||
#include <boost/asio/signal_set.hpp>
|
#include <boost/asio/signal_set.hpp>
|
||||||
|
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
|
@ -76,9 +80,19 @@ void Server::serve(ServiceSetup &setup)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// signal systemd that the service is ready
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, argsToString("READY=1\nSTATUS=Listening on http://", setup.webServer.address.to_string(), ':', setup.webServer.port).data());
|
||||||
|
#endif
|
||||||
|
|
||||||
// run the IO service on the requested number of threads
|
// run the IO service on the requested number of threads
|
||||||
const auto additionalThreads = ThreadPool("Web server", setup.webServer.ioContext, setup.webServer.threadCount - 1);
|
const auto additionalThreads = ThreadPool("Web server", setup.webServer.ioContext, setup.webServer.threadCount - 1);
|
||||||
setup.webServer.ioContext.run();
|
setup.webServer.ioContext.run();
|
||||||
|
|
||||||
|
// signal systemd that the service is stopping
|
||||||
|
#ifdef USE_LIBSYSTEMD
|
||||||
|
sd_notify(0, "STOPPING=1");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::stop()
|
void Server::stop()
|
||||||
|
|
|
@ -3,6 +3,7 @@ Description=@SYSTEMD_SERVICE_DESCRIPTION@
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
Type=notify
|
||||||
User=@SYSTEMD_SERVICE_USER_NAME@
|
User=@SYSTEMD_SERVICE_USER_NAME@
|
||||||
ExecStart=@SYSTEMD_SERVICE_EXEC@
|
ExecStart=@SYSTEMD_SERVICE_EXEC@
|
||||||
KillSignal=SIGQUIT
|
KillSignal=SIGQUIT
|
||||||
|
|
Loading…
Reference in New Issue