I just noticed some checkins by Jason for PID files and whatnot. Anyway, I have a different version of Launch.py that handles some similar issues -- writes its PID out to a file, changes its user and group, opens the log file. It also checks if there's another Webware appserver (using the same pid file) and kills it if necessary (i.e., does a restart). This removes most of the logic from the rc/init script, and away from stupid shell scripting, which I can never get to work like I think it should.

I don't really like using Launch for all this, since it gets written out by MakeAppWorkDir. I still don't quite understand what Launch is for. I'll just attach it to this email, and maybe people can suggest where it should go. (Also, I don't know if any of this applies to Windows -- probably not)

--
Ian Bicking  /  [EMAIL PROTECTED]  /  http://blog.ianbicking.org
#!/usr/local/bin/python2.2

import os, sys, signal

webwarePath = '/usr/local/share/webware'
appWorkPath = '%%APP_WORK_DIR%%'
sys.path.extend([%%APP_PYTHON_PATH%%])

def main(args):
        global webwarePath, appWorkPath
        logFile = uid = gid = pidFile = None
        newArgs = []
        # @@: This really should be using getopt or something
        for arg in args:
                if arg.startswith('--webware-path='):
                        webwarePath = arg[15:]
                elif arg.startswith('--working-path='):
                        appWorkPath = arg[15:]
                elif arg.startswith('--log-file='):
                        logFile = arg[len('--log-file='):]
                elif arg.startswith('--user='):
                        uid = arg[len('--user='):]
                elif arg.startswith('--group='):
                        gid = arg[len('--group='):]
                elif arg.startswith('--pid-file='):
                        pidFile = arg[len('--pid-file='):]
                else:
                        newArgs.append(arg)
        if uid:
                try:
                        uid = int(uid)
                except ValueError:
                        import pwd
                        try:
                                entry = pwd.getpwnam(uid)
                        except KeyError:
                                raise KeyError, "Bad username: %r; no such user 
exists" % uid
                        if not gid:
                                gid = entry[3]
                        uid = entry[2]
        if gid:
                try:
                        gid = int(gid)
                except ValueError:
                        import grp
                        try:
                                entry = grp.getgrnam(gid)
                        except KeyError:
                                raise KeyError, "Bad group: %r; no such group 
exists" % gid
                        gid = entry[2]

        if pidFile:
                if os.path.exists(pidFile):
                        f = open(pidFile)
                        pid = int(f.read())
                        f.close()
                        print 'PID file (%s) contains PID %s; killing...' % 
(pidFile, pid),
                        try:
                                os.kill(pid, signal.SIGKILL)
                        except OSError, e:
                                if e.errno == 3: # No such process
                                        print 'PID file was stale, continuing 
with startup.'
                                else:
                                        raise
                        else:
                                print 'Signal sent, waiting for exit...',
                                try:
                                        os.waitpid(pid, 0)
                                except OSError, e:
                                        if e.errno == 10: # No such process
                                                pass
                                        else:
                                                raise
                                print 'done.'
                f = open(pidFile, 'w')
                f.write(str(os.getpid()))
                f.close()
        if gid:
                os.setgid(gid)
        if uid:
                os.setuid(uid)
        #print 'Setting uid: %s; gid: %s' % (uid, gid)
        if logFile:
                f = open(logFile, 'a', 1) # 1==line buffered
                sys.stdout = sys.stderr = f
                pass
        args = newArgs
        # ensure Webware is on sys.path
        sys.path.insert(0, webwarePath)

        # import the master launcher
        import WebKit.Launch

        if len(args) < 2:
                WebKit.Launch.usage()

        # Go!
        WebKit.Launch.launchWebKit(args[1], appWorkPath, args[2:])


if __name__=='__main__':
        main(sys.argv)

Reply via email to