mirror of
https://github.com/troglobit/finit.git
synced 2026-11-06 15:51:03 +00:00
Add HOOK_SVC_LOST to detect lost processes
This patch adds support for the runtime `HOOK_SVC_LOST` and the (very noisy) *example* plugin `lost.so`. Customer request. Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
e54c7eef65
commit
3f3220e806
7 files changed
+90
-7
No files matched your search
@@ -480,6 +480,9 @@ For your convenience a set of *optional* plugins are available:
|
|||||||
|
|
||||||
* *initctl.so*: Extends finit with a traditional `initctl` functionality.
|
* *initctl.so*: Extends finit with a traditional `initctl` functionality.
|
||||||
|
|
||||||
|
* *lost.so*: Very simple `HOOK_SVC_LOST` example. Logs process ID and
|
||||||
|
name to syslog.
|
||||||
|
|
||||||
* *netlink.so*: Listens to Linux kernel Netlink events for gateway and
|
* *netlink.so*: Listens to Linux kernel Netlink events for gateway and
|
||||||
interfaces. These events are then sent to the Finit service monitor
|
interfaces. These events are then sent to the Finit service monitor
|
||||||
for services that may want to be SIGHUP'ed on new default route or
|
for services that may want to be SIGHUP'ed on new default route or
|
||||||
@@ -527,6 +530,14 @@ state, etc. Available hook points are:
|
|||||||
all modified/removed services have been stopped. When the hook has
|
all modified/removed services have been stopped. When the hook has
|
||||||
completed, Finit continues to start all modified and new services.
|
completed, Finit continues to start all modified and new services.
|
||||||
|
|
||||||
|
* `HOOK_SVC_LOST`: Called when a process is lost. When reconfiguring
|
||||||
|
services at runtime this hook may be called a lot. However, it may be
|
||||||
|
a quite useful hook to monitor a system post bootstrap when no, or
|
||||||
|
few, services are expected to exit. A default plugin `lost.so` is
|
||||||
|
available in the `plugins/` subdirectory as an example.
|
||||||
|
|
||||||
|
**NOTE:** This hook callback gets the lost PID as argument.
|
||||||
|
|
||||||
* `HOOK_RUNLEVEL_CHANGE`: Called when the user has issued a runlevel
|
* `HOOK_RUNLEVEL_CHANGE`: Called when the user has issued a runlevel
|
||||||
change. The hook is called when services not matching the new
|
change. The hook is called when services not matching the new
|
||||||
runlevel have been been stopped. When the hook has completed, Finit
|
runlevel have been been stopped. When the hook has completed, Finit
|
||||||
|
|||||||
@@ -166,18 +166,26 @@ plugin_t *plugin_find(char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Private daemon API *******************************************************/
|
/* Private daemon API *******************************************************/
|
||||||
void plugin_run_hooks(hook_point_t no)
|
|
||||||
|
/* Some hooks are called with a fixed argument, like HOOK_SVC_LOST */
|
||||||
|
void plugin_run_hook(hook_point_t no, void *arg)
|
||||||
{
|
{
|
||||||
plugin_t *p, *tmp;
|
plugin_t *p, *tmp;
|
||||||
|
|
||||||
PLUGIN_ITERATOR(p, tmp) {
|
PLUGIN_ITERATOR(p, tmp) {
|
||||||
if (p->hook[no].cb) {
|
if (p->hook[no].cb) {
|
||||||
_d("Calling %s hook n:o %d from runloop...", basename(p->name), no);
|
_d("Calling %s hook n:o %d (arg: %p) ...", basename(p->name), no, arg);
|
||||||
p->hook[no].cb(p->hook[no].arg);
|
p->hook[no].cb(arg ? arg : p->hook[no].arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Regular hooks are called with the registered plugin's argument */
|
||||||
|
void plugin_run_hooks(hook_point_t no)
|
||||||
|
{
|
||||||
|
plugin_run_hook(no, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Generic libev I/O callback, looks up correct plugin and calls its callback */
|
/* Generic libev I/O callback, looks up correct plugin and calls its callback */
|
||||||
static void generic_io_cb(uev_t *w, void *arg, int events)
|
static void generic_io_cb(uev_t *w, void *arg, int events)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ typedef enum {
|
|||||||
|
|
||||||
/* Runtime hooks */
|
/* Runtime hooks */
|
||||||
HOOK_SVC_RECONF,
|
HOOK_SVC_RECONF,
|
||||||
|
HOOK_SVC_LOST,
|
||||||
HOOK_RUNLEVEL_CHANGE,
|
HOOK_RUNLEVEL_CHANGE,
|
||||||
|
|
||||||
/* Shutdown hooks */
|
/* Shutdown hooks */
|
||||||
|
|||||||
+4
-4
@@ -5,12 +5,12 @@ AM_CPPFLAGS += -DFINIT_FIFO=\"$(fifo)\"
|
|||||||
|
|
||||||
if STATIC
|
if STATIC
|
||||||
noinst_LTLIBRARIES = libplug.la
|
noinst_LTLIBRARIES = libplug.la
|
||||||
libplug_la_SOURCES = alsa-utils.c bootmisc.c dbus.c hwclock.c \
|
libplug_la_SOURCES = alsa-utils.c bootmisc.c dbus.c hwclock.c \
|
||||||
initctl.c netlink.c pidfile.c resolvconf.c \
|
initctl.c lost.c netlink.c pidfile.c resolvconf.c \
|
||||||
time.c tty.c urandom.c x11-common.c
|
time.c tty.c urandom.c x11-common.c
|
||||||
else
|
else
|
||||||
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la dbus.la hwclock.la \
|
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la dbus.la hwclock.la \
|
||||||
initctl.la netlink.la pidfile.la resolvconf.la \
|
initctl.la lost.la netlink.la pidfile.la resolvconf.la \
|
||||||
time.la tty.la urandom.la x11-common.la
|
time.la tty.la urandom.la x11-common.la
|
||||||
|
|
||||||
# Clean up .la files installed by libtool despite being in -module mode
|
# Clean up .la files installed by libtool despite being in -module mode
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/* Example HOOK_SVC_LOST plugin, very noisy do not use as-is!
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 Joachim Nilsson <troglobit@gmail.com>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../finit.h"
|
||||||
|
#include "../svc.h"
|
||||||
|
#include "../plugin.h"
|
||||||
|
|
||||||
|
static void lost_pid(void *arg)
|
||||||
|
{
|
||||||
|
pid_t pid = (uintptr_t)arg;
|
||||||
|
svc_t *svc;
|
||||||
|
|
||||||
|
svc = svc_find_by_pid(pid);
|
||||||
|
if (!svc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FLOG_INFO("Lost PID %u, svc %s", pid, svc->cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static plugin_t plugin = {
|
||||||
|
.name = __FILE__,
|
||||||
|
.hook[HOOK_SVC_LOST] = { .cb = lost_pid },
|
||||||
|
};
|
||||||
|
|
||||||
|
PLUGIN_INIT(plugin_init)
|
||||||
|
{
|
||||||
|
plugin_register(&plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
PLUGIN_EXIT(plugin_exit)
|
||||||
|
{
|
||||||
|
plugin_unregister(&plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local Variables:
|
||||||
|
* indent-tabs-mode: t
|
||||||
|
* c-file-style: "linux"
|
||||||
|
* End:
|
||||||
|
*/
|
||||||
@@ -36,6 +36,7 @@ int client (int argc, char *argv[]);
|
|||||||
void service_bootstrap(void);
|
void service_bootstrap(void);
|
||||||
void service_monitor (pid_t lost);
|
void service_monitor (pid_t lost);
|
||||||
|
|
||||||
|
void plugin_run_hook (hook_point_t no, void *arg);
|
||||||
void plugin_run_hooks (hook_point_t no);
|
void plugin_run_hooks (hook_point_t no);
|
||||||
int plugin_load_all (uev_ctx_t *ctx, char *path);
|
int plugin_load_all (uev_ctx_t *ctx, char *path);
|
||||||
|
|
||||||
|
|||||||
@@ -740,6 +740,8 @@ void service_monitor(pid_t lost)
|
|||||||
if (tty_respawn(lost))
|
if (tty_respawn(lost))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
plugin_run_hook(HOOK_SVC_LOST, (void *)(uintptr_t)lost);
|
||||||
|
|
||||||
svc = svc_find_by_pid(lost);
|
svc = svc_find_by_pid(lost);
|
||||||
if (!svc) {
|
if (!svc) {
|
||||||
_d("collected unknown PID %d", lost);
|
_d("collected unknown PID %d", lost);
|
||||||
|
|||||||
Reference in new issue
Block a user