|
@@ -665,7 +665,6 @@ class ServerOptions(Options):
|
|
kwargs['expansions'] = expansions
|
|
kwargs['expansions'] = expansions
|
|
return parser.saneget(section, opt, default, **kwargs)
|
|
return parser.saneget(section, opt, default, **kwargs)
|
|
|
|
|
|
-
|
|
|
|
# process heterogeneous groups
|
|
# process heterogeneous groups
|
|
for section in all_sections:
|
|
for section in all_sections:
|
|
if not section.startswith('group:'):
|
|
if not section.startswith('group:'):
|
|
@@ -710,6 +709,7 @@ class ServerOptions(Options):
|
|
# and stopped last at mainloop exit
|
|
# and stopped last at mainloop exit
|
|
priority = integer(get(section, 'priority', -1))
|
|
priority = integer(get(section, 'priority', -1))
|
|
buffer_size = integer(get(section, 'buffer_size', 10))
|
|
buffer_size = integer(get(section, 'buffer_size', 10))
|
|
|
|
+
|
|
result_handler = get(section, 'result_handler',
|
|
result_handler = get(section, 'result_handler',
|
|
'supervisor.dispatchers:default_handler')
|
|
'supervisor.dispatchers:default_handler')
|
|
try:
|
|
try:
|
|
@@ -717,12 +717,14 @@ class ServerOptions(Options):
|
|
except ImportError:
|
|
except ImportError:
|
|
raise ValueError('%s cannot be resolved within [%s]' % (
|
|
raise ValueError('%s cannot be resolved within [%s]' % (
|
|
result_handler, section))
|
|
result_handler, section))
|
|
|
|
+
|
|
pool_event_names = [x.upper() for x in
|
|
pool_event_names = [x.upper() for x in
|
|
list_of_strings(get(section, 'events', ''))]
|
|
list_of_strings(get(section, 'events', ''))]
|
|
pool_event_names = set(pool_event_names)
|
|
pool_event_names = set(pool_event_names)
|
|
if not pool_event_names:
|
|
if not pool_event_names:
|
|
raise ValueError('[%s] section requires an "events" line' %
|
|
raise ValueError('[%s] section requires an "events" line' %
|
|
section)
|
|
section)
|
|
|
|
+
|
|
from supervisor.events import EventTypes
|
|
from supervisor.events import EventTypes
|
|
pool_events = []
|
|
pool_events = []
|
|
for pool_event_name in pool_event_names:
|
|
for pool_event_name in pool_event_names:
|
|
@@ -731,6 +733,13 @@ class ServerOptions(Options):
|
|
raise ValueError('Unknown event type %s in [%s] events' %
|
|
raise ValueError('Unknown event type %s in [%s] events' %
|
|
(pool_event_name, section))
|
|
(pool_event_name, section))
|
|
pool_events.append(pool_event)
|
|
pool_events.append(pool_event)
|
|
|
|
+
|
|
|
|
+ redirect_stderr = boolean(get(section, 'redirect_stderr', 'false'))
|
|
|
|
+ if redirect_stderr:
|
|
|
|
+ raise ValueError('[%s] section sets redirect_stderr=true '
|
|
|
|
+ 'but this is not allowed because it will interfere '
|
|
|
|
+ 'with the eventlistener protocol' % section)
|
|
|
|
+
|
|
processes=self.processes_from_section(parser, section, pool_name,
|
|
processes=self.processes_from_section(parser, section, pool_name,
|
|
EventListenerConfig)
|
|
EventListenerConfig)
|
|
|
|
|
|
@@ -861,6 +870,7 @@ class ServerOptions(Options):
|
|
stopasgroup = boolean(get(section, 'stopasgroup', 'false'))
|
|
stopasgroup = boolean(get(section, 'stopasgroup', 'false'))
|
|
killasgroup = boolean(get(section, 'killasgroup', stopasgroup))
|
|
killasgroup = boolean(get(section, 'killasgroup', stopasgroup))
|
|
exitcodes = list_of_exitcodes(get(section, 'exitcodes', '0,2'))
|
|
exitcodes = list_of_exitcodes(get(section, 'exitcodes', '0,2'))
|
|
|
|
+ # see also redirect_stderr check in process_groups_from_parser()
|
|
redirect_stderr = boolean(get(section, 'redirect_stderr','false'))
|
|
redirect_stderr = boolean(get(section, 'redirect_stderr','false'))
|
|
numprocs = integer(get(section, 'numprocs', 1))
|
|
numprocs = integer(get(section, 'numprocs', 1))
|
|
numprocs_start = integer(get(section, 'numprocs_start', 0))
|
|
numprocs_start = integer(get(section, 'numprocs_start', 0))
|
|
@@ -1785,7 +1795,9 @@ class ProcessConfig(Config):
|
|
|
|
|
|
class EventListenerConfig(ProcessConfig):
|
|
class EventListenerConfig(ProcessConfig):
|
|
def make_dispatchers(self, proc):
|
|
def make_dispatchers(self, proc):
|
|
- use_stderr = not self.redirect_stderr
|
|
|
|
|
|
+ # always use_stderr=True for eventlisteners because mixing stderr
|
|
|
|
+ # messages into stdout would break the eventlistener protocol
|
|
|
|
+ use_stderr = True
|
|
p = self.options.make_pipes(use_stderr)
|
|
p = self.options.make_pipes(use_stderr)
|
|
stdout_fd,stderr_fd,stdin_fd = p['stdout'],p['stderr'],p['stdin']
|
|
stdout_fd,stderr_fd,stdin_fd = p['stdout'],p['stderr'],p['stdin']
|
|
dispatchers = {}
|
|
dispatchers = {}
|