When SIGTERM times out, procd sends SIGKILL and then restarts the
process once SIGCHLD has been received. This all works fine, with one
exception - respawn is not restored when instance_start() is called from
instance_exit(). The reason is that respawn is always set to false in
instance_stop(), and the same service_instance struct is used for the
instance_start()-call.

The consequence is that if the process is killed/crashes again, it will
not respawn. Solve this issue by adding a variable used to store the
original value of respawn in instance_stop(), and then restore the
original respawn-value in instance_exit().

Signed-off-by: Kristian Evensen <kristian.even...@gmail.com>
---
 service/instance.c | 6 ++++--
 service/instance.h | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/service/instance.c b/service/instance.c
index b7cb523..76c74ed 100644
--- a/service/instance.c
+++ b/service/instance.c
@@ -532,9 +532,10 @@ instance_exit(struct uloop_process *p, int ret)
 
        if (in->halt) {
                instance_removepid(in);
-               if (in->restart)
+               if (in->restart) {
+                       in->respawn = in->respawn_org;
                        instance_start(in);
-               else {
+               } else {
                        struct service *s = in->srv;
 
                        avl_delete(&s->instances.avl, &in->node.avl);
@@ -567,6 +568,7 @@ instance_stop(struct service_instance *in, bool halt)
        if (!in->proc.pending)
                return;
        in->halt = halt;
+       in->respawn_org = in->respawn;
        in->restart = in->respawn = false;
        kill(in->proc.pid, SIGTERM);
        uloop_timeout_set(&in->timeout, in->term_timeout * 1000);
diff --git a/service/instance.h b/service/instance.h
index bdd14de..a0ac302 100644
--- a/service/instance.h
+++ b/service/instance.h
@@ -48,6 +48,7 @@ struct service_instance {
        bool halt;
        bool restart;
        bool respawn;
+       bool respawn_org;
        int respawn_count;
        int reload_signal;
        struct timespec start;
-- 
2.11.0


_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to