Ver Fonte

Per-process exit code parameters.

Chris McDonough há 19 anos atrás
pai
commit
16fd7a5dae
5 ficheiros alterados com 21 adições e 20 exclusões
  1. 0 1
      TODO.txt
  2. 1 1
      sample.conf
  3. 10 10
      src/supervisor/options.py
  4. 2 2
      src/supervisor/supervisord.py
  5. 8 6
      src/supervisor/tests.py

+ 0 - 1
TODO.txt

@@ -18,7 +18,6 @@
 
 - Unit tests for meld classes and ui server.
 
-- Per-process exit code specifications.
 - Create named process log files after we setuid.
 
 - Change xmlrpc_user/xmlrpc_password to http_X.

+ 1 - 1
sample.conf

@@ -4,7 +4,6 @@ xmlrpc_port=127.0.0.1:9001  ; (alternately, ip_address:port specifies AF_INET)
 ;sockchmod=0700              ; AF_UNIX socketmode (AF_INET ignore, default 0700)
 ;sockchown=nobody.nogroup     ; AF_UNIX socket uid.gid owner (AF_INET ignores)
 ;umask=022                   ; (process file creation umask;default 022)
-exitcodes=0,2               ; ('expected' exit codes;default 0,2)
 logfile=/tmp/supervisord.log     ; (main log file;default $CWD/supervisord.log)
 logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
 logfile_backups=10          ; (num of main logfile rotation backups;default 10)
@@ -40,6 +39,7 @@ serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
 ;logfile_backups=2           ; # of logfile backups if autorotating (default 1)
 ;logfile_maxbytes=1MB        ; max # logfile bytes before rotation (default 5MB)
 ;stopsignal=QUIT             ; signal used to kill process (default TERM)
+;exitcodes=0,2               ; 'expected' exit codes for process (default 0,2)
 
 [program:cat]
 command=/bin/cat

+ 10 - 10
src/supervisor/options.py

@@ -10,7 +10,6 @@ Options:
 -h/--help -- print this usage message and exit
 -u/--user USER -- run supervisord as this user (or numeric uid)
 -m/--umask UMASK -- use this umask for daemon subprocess (default is 022)
--x/--exitcodes LIST -- list of fatal exit codes (default "0,2")
 -d/--directory DIRECTORY -- directory to chdir to when daemonized
 -l/--logfile FILENAME -- use FILENAME as logfile path
 -y/--logfile_maxbytes BYTES -- use BYTES to limit the max size of logfile
@@ -469,8 +468,6 @@ class ServerOptions(Options):
                  default=0)
         self.add("forever", "supervisord.forever", "f", "forever",
                  flag=1, default=0)
-        self.add("exitcodes", "supervisord.exitcodes", "x:", "exitcodes=",
-                 datatypes.list_of_ints, default=[0, 2])
         self.add("user", "supervisord.user", "u:", "user=")
         self.add("umask", "supervisord.umask", "m:", "umask=",
                  datatypes.octal_type, default='022')
@@ -615,11 +612,6 @@ class ServerOptions(Options):
         section.backofflimit = limit
         forever = config.getdefault('forever', 'false')
         section.forever = datatypes.boolean(forever)
-        exitcodes = config.getdefault('exitcodes', '0,2')
-        try:
-            section.exitcodes = datatypes.list_of_ints(exitcodes)
-        except:
-            raise ValueError("exitcodes must be a list of ints e.g. 1,2")
         user = config.getdefault('user', None)
         section.user = user
 
@@ -733,13 +725,19 @@ class ServerOptions(Options):
             logfile_maxbytes = datatypes.integer(logfile_maxbytes)
             stopsignal = config.saneget(section, 'stopsignal', signal.SIGTERM)
             stopsignal = datatypes.signal(stopsignal)
+            exitcodes = config.saneget(section, 'exitcodes', '0,2')
+            try:
+                exitcodes = datatypes.list_of_ints(exitcodes)
+            except:
+                raise ValueError("exitcodes must be a list of ints e.g. 1,2")
             pconfig = ProcessConfig(name=name, command=command,
                                     priority=priority, autostart=autostart,
                                     autorestart=autorestart, uid=uid,
                                     logfile=logfile,
                                     logfile_backups=logfile_backups,
                                     logfile_maxbytes=logfile_maxbytes,
-                                    stopsignal=stopsignal)
+                                    stopsignal=stopsignal,
+                                    exitcodes=exitcodes)
             programs.append(pconfig)
 
         programs.sort() # asc by priority
@@ -882,7 +880,8 @@ class UnhosedConfigParser(ConfigParser.RawConfigParser):
 
 class ProcessConfig:
     def __init__(self, name, command, priority, autostart, autorestart,
-                 uid, logfile, logfile_backups, logfile_maxbytes, stopsignal):
+                 uid, logfile, logfile_backups, logfile_maxbytes, stopsignal,
+                 exitcodes):
         self.name = name
         self.command = command
         self.priority = priority
@@ -893,6 +892,7 @@ class ProcessConfig:
         self.logfile_backups = logfile_backups
         self.logfile_maxbytes = logfile_maxbytes
         self.stopsignal = stopsignal
+        self.exitcodes = exitcodes
 
     def __cmp__(self, other):
         return cmp(self.priority, other.priority)

+ 2 - 2
src/supervisor/supervisord.py

@@ -367,7 +367,7 @@ class Subprocess:
             if self.killing:
                 self.killing = 0
                 self.delay = 0
-            elif not es in self.options.exitcodes:
+            elif not es in self.config.exitcodes:
                 self.governor()
 
             if self.pid:
@@ -377,7 +377,7 @@ class Subprocess:
             self.stdoutfd = self.stderrfd  = self.stdinfd = None
             self.stdout = self.stderr = self.stdin = None
 
-            if es in self.options.exitcodes and not self.killing:
+            if es in self.config.exitcodes and not self.killing:
                 msg = msg + "; OK"
             self.options.logger.info(msg)
             self.exitstatus = es

+ 8 - 6
src/supervisor/tests.py

@@ -41,7 +41,6 @@ xmlrpc_password=foo        ; (default is no password (open system))
 directory=%(tempdir)s     ; (default is not to cd during daemonization)
 backofflimit=10            ; (default 3)
 forever=false              ; (default false)
-exitcodes=0,1              ; (default 0,2)
 user=root                  ; (default is current user, required if root)
 umask=022                  ; (default 022)
 logfile=supervisord.log    ; (default supervisord.log)
@@ -75,6 +74,7 @@ logfile = /tmp/cat2.log
 
 [program:cat3]
 command=/bin/cat
+exitcodes=0,1,127
 """ % {'tempdir':tempfile.gettempdir()}
 
         from StringIO import StringIO
@@ -87,7 +87,6 @@ command=/bin/cat
         self.assertEqual(options.directory, tempfile.gettempdir())
         self.assertEqual(options.backofflimit, 10)
         self.assertEqual(options.forever, False)
-        self.assertEqual(options.exitcodes, [0,1])
         self.assertEqual(options.umask, 022)
         self.assertEqual(options.logfile, 'supervisord.log')
         self.assertEqual(options.logfile_maxbytes, 1000 * 1024 * 1024)
@@ -118,6 +117,7 @@ command=/bin/cat
         self.assertEqual(cat.stopsignal, signal.SIGKILL)
         self.assertEqual(cat.logfile_maxbytes, datatypes.byte_size('5MB'))
         self.assertEqual(cat.logfile_backups, 1)
+        self.assertEqual(cat.exitcodes, [0,2])
 
         cat2 = options.programs[1]
         self.assertEqual(cat2.name, 'cat2')
@@ -130,6 +130,7 @@ command=/bin/cat
         self.assertEqual(cat2.stopsignal, signal.SIGTERM)
         self.assertEqual(cat2.logfile_maxbytes, 1024)
         self.assertEqual(cat2.logfile_backups, 2)
+        self.assertEqual(cat2.exitcodes, [0,2])
 
         cat3 = options.programs[2]
         self.assertEqual(cat3.name, 'cat3')
@@ -141,6 +142,7 @@ command=/bin/cat
         self.assertEqual(cat3.logfile, instance.AUTOMATIC)
         self.assertEqual(cat3.logfile_maxbytes, datatypes.byte_size('5MB'))
         self.assertEqual(cat3.logfile_backups, 1)
+        self.assertEqual(cat3.exitcodes, [0,1,127])
         
         self.assertEqual(cat2.stopsignal, signal.SIGTERM)
 
@@ -150,7 +152,6 @@ command=/bin/cat
         self.assertEqual(instance.directory, '/tmp')
         self.assertEqual(instance.backofflimit, 10)
         self.assertEqual(instance.forever, False)
-        self.assertEqual(instance.exitcodes, [0,1])
         self.assertEqual(instance.umask, 022)
         self.assertEqual(instance.logfile, os.path.join(here,'supervisord.log'))
         self.assertEqual(instance.logfile_maxbytes, 1000 * 1024 * 1024)
@@ -1689,7 +1690,8 @@ class DummyProcess:
 class DummyPConfig:
     def __init__(self, name, command, priority=999, autostart=True,
                  autorestart=False, uid=None, logfile=None, logfile_backups=0,
-                 logfile_maxbytes=0):
+                 logfile_maxbytes=0, stopsignal=signal.SIGTERM,
+                 exitcodes=[0,2]):
         self.name = name
         self.command = command
         self.priority = priority
@@ -1699,7 +1701,8 @@ class DummyPConfig:
         self.logfile = logfile
         self.logfile_backups = logfile_backups
         self.logfile_maxbytes = logfile_maxbytes
-
+        self.stopsignal = stopsignal
+        self.exitcodes = exitcodes
 
 class DummyLogger:
     def __init__(self):
@@ -1726,7 +1729,6 @@ class DummyOptions:
         self.uid = 999
         self.logger = self.getLogger()
         self.backofflimit = 10
-        self.exitcodes = 0,2
         self.logfile = '/tmp/logfile'
         self.nocleanup = True