/* Special setting for all SysV services */
s->valid_no_process = true;
+ s->kill_mode = KILL_PROCESS_GROUP;
/* Don't timeout special services during boot (like fsck) */
if (s->sysv_runlevels && !chars_intersect("12345", s->sysv_runlevels))
s->deserialized_state == SERVICE_STOP_POST ||
s->deserialized_state == SERVICE_FINAL_SIGTERM ||
s->deserialized_state == SERVICE_FINAL_SIGKILL ||
- s->deserialized_state == SERVICE_AUTO_RESTART)
- if ((r = unit_watch_timer(UNIT(s),
- s->deserialized_state == SERVICE_AUTO_RESTART ?
- s->restart_usec :
- s->timeout_usec,
- &s->timer_watch)) < 0)
- return r;
+ s->deserialized_state == SERVICE_AUTO_RESTART) {
+
+ if (s->deserialized_state == SERVICE_AUTO_RESTART || s->timeout_usec > 0) {
+ usec_t k;
+
+ k = s->deserialized_state == SERVICE_AUTO_RESTART ? s->restart_usec : s->timeout_usec;
+
+ if ((r = unit_watch_timer(UNIT(s), k, &s->timer_watch)) < 0)
+ return r;
+ }
+ }
if ((s->deserialized_state == SERVICE_START &&
(s->type == SERVICE_FORKING ||
goto fail;
}
- if (timeout) {
+ if (timeout && s->timeout_usec) {
if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
goto fail;
} else
s->failure = true;
if (allow_restart &&
+ s->allow_restart &&
(s->restart == SERVICE_RESTART_ALWAYS ||
(s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure))) {
}
}
- if (sent) {
- if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
- goto fail;
+ if (sent && (s->main_pid > 0 || s->control_pid > 0)) {
+ if (s->timeout_usec > 0)
+ if ((r = unit_watch_timer(UNIT(s), s->timeout_usec, &s->timer_watch)) < 0)
+ goto fail;
service_set_state(s, state);
} else if (state == SERVICE_STOP_SIGTERM || state == SERVICE_STOP_SIGKILL)
s->failure = false;
s->main_pid_known = false;
+ s->allow_restart = true;
service_enter_start_pre(s);
return 0;
assert(s->state == SERVICE_RUNNING || s->state == SERVICE_EXITED);
+ /* This is a user request, so don't do restarts on this
+ * shutdown. */
+ s->allow_restart = false;
+
service_enter_stop(s, true);
return 0;
}
* commands attached here, we will start from the first one
* again */
if (s->control_command_id >= 0)
- unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(s->control_command_id));
+ unit_serialize_item(u, f, "control-command", service_exec_command_to_string(s->control_command_id));
if (s->socket_fd >= 0) {
int copy;
if ((r = unit_add_dependency(runlevel_target, UNIT_WANTS, service, true)) < 0)
goto finish;
- if ((r = unit_add_dependency(runlevel_target, UNIT_AFTER, service, true)) < 0)
+ if ((r = unit_add_dependency(service, UNIT_BEFORE, runlevel_target, true)) < 0)
goto finish;
} else if (de->d_name[0] == 'K' &&
if ((r = manager_load_unit(m, SPECIAL_SHUTDOWN_TARGET, NULL, &shutdown_target)) < 0)
goto finish;
- if ((r = unit_add_dependency(shutdown_target, UNIT_CONFLICTS, service, true)) < 0)
+ if ((r = unit_add_dependency(service, UNIT_CONFLICTS, shutdown_target, true)) < 0)
goto finish;
- if ((r = unit_add_dependency(shutdown_target, UNIT_BEFORE, service, true)) < 0)
+ if ((r = unit_add_dependency(service, UNIT_BEFORE, shutdown_target, true)) < 0)
goto finish;
}
}