[OpenWrt-Devel] [PATCH] procd: show process's exit code
Ondřej Votava
ondrej.votava at cvut.cz
Thu Jan 23 09:29:57 EST 2020
Adds feature to show exit code of processes launched by procd.
The exit code is shown for finished process when ubus's
service list method is called.
The exit code value is computed according to waitpid(2)
and http://tldp.org/LDP/abs/html/exitcodes.html
Signed-off-by: Ondřej Votava <ondrej.votava at cvut.cz>
---
service/instance.c | 22 ++++++++++++++++++++++
service/instance.h | 2 ++
2 files changed, 24 insertions(+)
diff --git a/service/instance.c b/service/instance.c
index abd1f34..3aad426 100644
--- a/service/instance.c
+++ b/service/instance.c
@@ -560,6 +560,24 @@ instance_delete(struct service_instance *in)
service_stopped(s);
}
+static int
+instance_exit_code(int ret)
+{
+ if (WIFEXITED(ret)) {
+ return WEXITSTATUS(ret);
+ }
+
+ if (WIFSIGNALED(ret)) {
+ return SIGNALLED_OFFSET + WTERMSIG(ret);
+ }
+
+ if (WIFSTOPPED(ret)) {
+ return WSTOPSIG(ret);
+ }
+
+ return 1;
+}
+
static void
instance_exit(struct uloop_process *p, int ret)
{
@@ -574,6 +592,7 @@ instance_exit(struct uloop_process *p, int ret)
DEBUG(2, "Instance %s::%s exit with error code %d after %ld seconds\n", in->srv->name, in->name, ret, runtime);
+ in->exit_code = instance_exit_code(ret);
uloop_timeout_cancel(&in->timeout);
service_event("instance.stop", in->srv->name, in->name);
@@ -1091,6 +1110,7 @@ instance_init(struct service_instance *in, struct service *s, struct blob_attr *
in->proc.cb = instance_exit;
in->term_timeout = 5;
in->syslog_facility = LOG_DAEMON;
+ in->exit_code = 0;
in->_stdout.fd.fd = -2;
in->_stdout.stream.string_data = true;
@@ -1124,6 +1144,8 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose)
if (in->command)
blobmsg_add_blob(b, in->command);
blobmsg_add_u32(b, "term_timeout", in->term_timeout);
+ if (!in->proc.pending)
+ blobmsg_add_u32(b, "exit_code", in->exit_code);
if (!avl_is_empty(&in->errors.avl)) {
struct blobmsg_list_node *var;
diff --git a/service/instance.h b/service/instance.h
index 42cc4be..d7b4319 100644
--- a/service/instance.h
+++ b/service/instance.h
@@ -21,6 +21,7 @@
#include "../utils/utils.h"
#define RESPAWN_ERROR (5 * 60)
+#define SIGNALLED_OFFSET 128
struct jail {
bool procfs;
@@ -62,6 +63,7 @@ struct service_instance {
char *seccomp;
char *pidfile;
int syslog_facility;
+ int exit_code;
uint32_t term_timeout;
uint32_t respawn_timeout;
--
2.21.0 (Apple Git-122.2)
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list