initctl: Support for stop/start services by name:id

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson committed 2015-11-26 21:22:05 +01:00
1 parent 1f88e1ff8a
commit 263e23a0df
5 files changed
+72 -37

No files matched your search

+17 -16
View File
@@ -586,24 +586,25 @@ not return until the given command has fully completed.
Usage: initctl [OPTIONS] <COMMAND> Usage: initctl [OPTIONS] <COMMAND>
Options: Options:
-d, --debug Debug initctl (client) -d, --debug Debug initctl (client)
-v, --verbose Verbose output -v, --verbose Verbose output
-h, --help This help text -h, --help This help text
Commands: Commands:
debug Toggle Finit (daemon) debug debug Toggle Finit (daemon) debug
emit <EV> Emit an event. Can be a predefined event: RELOAD, STOP, help This help text
START, or a custom string to match the event list in a emit <EV> Emit event; a predefined event: RELOAD, STOP, START
service stanza, e.g: GW:UP, IFUP:IFNAME, IFDN:IFNAME, or a custom string matching an event in a service
where IFNAME is the interface name, e.g. eth0 stanza, e.g: GW:UP, IFUP:IFNAME, IFDN:IFNAME. Where
reload Reload *.conf in /etc/finit.d/ and activate changes IFNAME is the interface name, e.g. eth0
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot reload Reload *.conf in /etc/finit.d/ and activate changes
status | show Show status of services runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
start <JOB|NAME> Start stopped job or service status | show Show status of services
stop <JOB|NAME> Stop/Pause running job or service start <JOB|NAME>[:ID] Start service by job# or name, with optional ID
restart <JOB|NAME> Restart (stop/start) job or service stop <JOB|NAME>[:ID] Stop/Pause a running service by job# or name
reload <JOB|NAME> Reload (SIGHUP) job or service restart <JOB|NAME>[:ID] Restart (stop/start) service by job# or name
version Show Finit version reload <JOB|NAME>[:ID] Reload (SIGHUP) service by job# or name
version Show Finit version
``` ```
The `emit <EV>` command can be used to send events to Finit. Built-in The `emit <EV>` command can be used to send events to Finit. Built-in
+10 -5
View File
@@ -77,10 +77,10 @@ static int call(int (*action)(svc_t *), char *buf, size_t len)
token = strtok_r(input, " ", &pos); token = strtok_r(input, " ", &pos);
while (token) { while (token) {
svc_t *svc; svc_t *svc;
char *ptr = strchr(token, ':');
if (isdigit(token[0])) { if (isdigit(token[0])) {
int job = atonum(token); int job = atonum(token);
char *ptr = strchr(token, ':');
if (!ptr) { if (!ptr) {
svc = svc_job_iterator(1, job); svc = svc_job_iterator(1, job);
@@ -95,10 +95,15 @@ static int call(int (*action)(svc_t *), char *buf, size_t len)
} }
} else { } else {
svc = svc_named_iterator(1, token); if (!ptr) {
while (svc) { svc = svc_named_iterator(1, token);
result += action(svc); while (svc) {
svc = svc_named_iterator(0, token); result += action(svc);
svc = svc_named_iterator(0, token);
}
} else {
*ptr++ = 0;
result += action(svc_find_by_nameid(token, atonum(ptr)));
} }
} }
+17 -16
View File
@@ -212,23 +212,24 @@ static int usage(int rc)
{ {
fprintf(stderr, "Usage: %s [OPTIONS] <COMMAND>\n\n" fprintf(stderr, "Usage: %s [OPTIONS] <COMMAND>\n\n"
"Options:\n" "Options:\n"
" -d, --debug Debug initctl (client)\n" " -d, --debug Debug initctl (client)\n"
" -v, --verbose Verbose output\n" " -v, --verbose Verbose output\n"
" -h, --help This help text\n\n" " -h, --help This help text\n\n"
"Commands:\n" "Commands:\n"
" debug Toggle Finit (daemon) debug\n" " debug Toggle Finit (daemon) debug\n"
" emit <EV> Emit an event. Can be a predefined event: RELOAD, STOP,\n" " help This help text\n"
" START, or a custom string to match the event list in a\n" " emit <EV> Emit event; a predefined event: RELOAD, STOP, START\n"
" service stanza, e.g: GW:UP, IFUP:IFNAME, IFDN:IFNAME,\n" " or a custom string matching an event in a service\n"
" where IFNAME is the interface name, e.g. eth0\n" " stanza, e.g: GW:UP, IFUP:IFNAME, IFDN:IFNAME. Where\n"
" reload Reload *.conf in /etc/finit.d/ and activate changes\n" " IFNAME is the interface name, e.g. eth0\n"
" runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot\n" " reload Reload *.conf in /etc/finit.d/ and activate changes\n"
" status | show Show status of services\n" " runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot\n"
" start <JOB|NAME> Start stopped job or service\n" " status | show Show status of services\n"
" stop <JOB|NAME> Stop/Pause running job or service\n" " start <JOB|NAME>[:ID] Start service by job# or name, with optional ID\n"
" restart <JOB|NAME> Restart (stop/start) job or service\n" " stop <JOB|NAME>[:ID] Stop/Pause a running service by job# or name\n"
" reload <JOB|NAME> Reload (SIGHUP) job or service\n" " restart <JOB|NAME>[:ID] Restart (stop/start) service by job# or name\n"
" version Show Finit version\n\n", __progname); " reload <JOB|NAME>[:ID] Reload (SIGHUP) service by job# or name\n"
" version Show Finit version\n\n", __progname);
return rc; return rc;
} }
+27
View File
@@ -310,6 +310,33 @@ svc_t *svc_find_by_jobid(int job, int id)
return NULL; return NULL;
} }
/**
* svc_find_by_nameid - Find an service object by its basename:ID
* @name: Process name to match
* @id: Instance id
*
* Returns:
* A pointer to an &svc_t object, or %NULL if not found.
*/
svc_t *svc_find_by_nameid(char *name, int id)
{
char *ptr;
svc_t *svc;
for (svc = svc_iterator(1); svc; svc = svc_iterator(0)) {
ptr = strrchr(svc->cmd, '/');
if (ptr)
ptr++;
else
ptr = svc->cmd;
if (svc->id == id && !strcmp(name, ptr))
return svc;
}
return NULL;
}
/** /**
* svc_mark_dynamic - Mark dynamically loaded services for deletion. * svc_mark_dynamic - Mark dynamically loaded services for deletion.
* *
+1
View File
@@ -131,6 +131,7 @@ int svc_del (svc_t *svc);
svc_t *svc_find (char *cmd, int id); svc_t *svc_find (char *cmd, int id);
svc_t *svc_find_by_pid (pid_t pid); svc_t *svc_find_by_pid (pid_t pid);
svc_t *svc_find_by_jobid (int job, int id); svc_t *svc_find_by_jobid (int job, int id);
svc_t *svc_find_by_nameid (char *name, int id);
svc_t *svc_iterator (int first); svc_t *svc_iterator (int first);
svc_t *svc_inetd_iterator (int first); svc_t *svc_inetd_iterator (int first);