The "FAILED" followed by "STOPPED" is somewhat redundant and arguably
incorrect.
bool prop_stop : 1;
bool restarting : 1; // re-starting after unexpected termination
bool prop_stop : 1;
bool restarting : 1; // re-starting after unexpected termination
+ bool start_failed : 1; // failed to start (reset when begins starting)
int required_by = 0; // number of dependents wanting this service to be started
int required_by = 0; // number of dependents wanting this service to be started
pinned_stopped(false), pinned_started(false), waiting_for_deps(false),
waiting_for_console(false), have_console(false), waiting_for_execstat(false),
start_explicit(false), prop_require(false), prop_release(false), prop_failure(false),
pinned_stopped(false), pinned_started(false), waiting_for_deps(false),
waiting_for_console(false), have_console(false), waiting_for_execstat(false),
start_explicit(false), prop_require(false), prop_release(false), prop_failure(false),
- prop_start(false), prop_stop(false), restarting(false), force_stop(false)
+ prop_start(false), prop_stop(false), restarting(false), start_failed(false),
+ force_stop(false)
{
services = set;
service_name = name;
{
services = set;
service_name = name;
- log_service_stopped(service_name);
+ // Start failure will have been logged already, only log if we are stopped for other reasons:
+ if (! start_failed) {
+ log_service_stopped(service_name);
+ }
notify_listeners(service_event_t::STOPPED);
}
notify_listeners(service_event_t::STOPPED);
}
services->service_active(this);
}
services->service_active(this);
}
service_state = service_state_t::STARTING;
waiting_for_deps = true;
service_state = service_state_t::STARTING;
waiting_for_deps = true;
log_service_failed(get_name());
notify_listeners(service_event_t::FAILEDSTART);
log_service_failed(get_name());
notify_listeners(service_event_t::FAILEDSTART);