INSTANCE_ATTR_JAIL,
INSTANCE_ATTR_TRACE,
INSTANCE_ATTR_SECCOMP,
+ INSTANCE_ATTR_PIDFILE,
__INSTANCE_ATTR_MAX
};
[INSTANCE_ATTR_JAIL] = { "jail", BLOBMSG_TYPE_TABLE },
[INSTANCE_ATTR_TRACE] = { "trace", BLOBMSG_TYPE_BOOL },
[INSTANCE_ATTR_SECCOMP] = { "seccomp", BLOBMSG_TYPE_STRING },
+ [INSTANCE_ATTR_PIDFILE] = { "pidfile", BLOBMSG_TYPE_STRING },
};
enum {
return argc;
}
+static int
+instance_removepid(struct service_instance *in) {
+ if (!in->pidfile)
+ return 0;
+ if (unlink(in->pidfile)) {
+ ERROR("Failed to removed pidfile: %s: %d - %s\n",
+ in->pidfile, errno, strerror(errno));
+ return 1;
+ }
+ return 0;
+}
+
+static int
+instance_writepid(struct service_instance *in)
+{
+ FILE *_pidfile;
+
+ if (!in->pidfile) {
+ return 0;
+ }
+ _pidfile = fopen(in->pidfile, "w");
+ if (_pidfile == NULL) {
+ ERROR("failed to open pidfile for writing: %s: %d (%s)",
+ in->pidfile, errno, strerror(errno));
+ return 1;
+ }
+ if (fprintf(_pidfile, "%d\n", in->proc.pid) < 0) {
+ ERROR("failed to write pidfile: %s: %d (%s)",
+ in->pidfile, errno, strerror(errno));
+ return 2;
+ }
+ if (fclose(_pidfile)) {
+ ERROR("failed to close pidfile: %s: %d (%s)",
+ in->pidfile, errno, strerror(errno));
+ return 3;
+ }
+
+ return 0;
+}
+
static void
instance_run(struct service_instance *in, int _stdout, int _stderr)
{
return;
}
- DEBUG(2, "Started instance %s::%s\n", in->srv->name, in->name);
+ DEBUG(2, "Started instance %s::%s[%d]\n", in->srv->name, in->name, pid);
in->proc.pid = pid;
+ instance_writepid(in);
clock_gettime(CLOCK_MONOTONIC, &in->start);
uloop_process_add(&in->proc);
in->halt = true;
in->restart = in->respawn = false;
kill(in->proc.pid, SIGTERM);
+ instance_removepid(in);
}
static void
in->halt = false;
in->restart = true;
kill(in->proc.pid, SIGTERM);
+ instance_removepid(in);
}
static bool
if (in->gid != in_new->gid)
return true;
+ if (in->pidfile && in_new->pidfile)
+ if (strcmp(in->pidfile, in_new->pidfile))
+ return true;
+
+ if (in->pidfile && !in_new->pidfile)
+ return true;
+
+ if (!in->pidfile && in_new->pidfile)
+ return true;
+
if (!blobmsg_list_equal(&in->limits, &in_new->limits))
return true;
else
in->seccomp = seccomp;
}
+
+ if (tb[INSTANCE_ATTR_PIDFILE]) {
+ char *pidfile = blobmsg_get_string(tb[INSTANCE_ATTR_PIDFILE]);
+ if (pidfile)
+ in->pidfile = pidfile;
+ }
+
if (!in->trace && tb[INSTANCE_ATTR_JAIL])
in->has_jail = instance_jail_parse(in, tb[INSTANCE_ATTR_JAIL]);
blobmsg_list_move(&in->jail.mount, &in_src->jail.mount);
in->trigger = in_src->trigger;
in->command = in_src->command;
+ in->pidfile = in_src->pidfile;
in->name = in_src->name;
in->node.avl.key = in_src->node.avl.key;
if (in->seccomp)
blobmsg_add_string(b, "seccomp", in->seccomp);
+ if (in->pidfile)
+ blobmsg_add_string(b, "pidfile", in->pidfile);
+
if (in->has_jail) {
void *r = blobmsg_open_table(b, "jail");
if (in->jail.name)