Brian Granger wrote:
Fantastic, thanks for sharing this code.  I will definitely have a look.  If
it turns out to
work for us, would you mind releasing this under a BSD license so we can
include
it in IPython (BSD open source project)?  In either case, the ideas will be
very helpful to us.

Cheers,

Brian


Sure, you can find a slightly updated version of the code in the attachment, licensed under the two clause BSD license and without the syntax error.

It would be even better if you could try to integrate the functionality into Twisted itself, if the core developers agree that it would be useful. I opened a ticket for this:

http://twistedmatrix.com/trac/ticket/4073

Regards,
Ziga
# Copyright (c) 2009 Ziga Seilnacht. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ''AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


import os
import sys
import msvcrt

try:
    import win32con
    import win32process
    import win32security
    import win32service
except ImportError:
    win32process = None

from twisted.python import win32



def getPythonArgs():
    """
    Return the list of command line args that were used to start
    the current Python interpreter and were not stored in C{sys.argv}.

    These are the options that control the Python interpreter itself,
    like the Python executable, optimization level, warning filters,
    division behaviour and literal string handling.
    """
    args = [sys.executable]
    for warnoption in sys.warnoptions:
        args.append("-W")
        args.append(warnoption)
    if type(1 / 2) is not int:
        args.append("-Qnew")
    if type("") is not str:
        args.append("-U")
    if not __debug__:
        if getPythonArgs.__doc__ is None:
            args.append("-OO")
        else:
            args.append("-O")
    return args



def daemonize():
    args = [os.path.abspath(__file__)] + sys.argv
    executable = sys.executable
    cmdline = win32.quoteArguments(getPythonArgs() + args)
    inherit = False
    priority = win32process.GetPriorityClass(win32process.GetCurrentProcess())
    flags = (win32process.CREATE_BREAKAWAY_FROM_JOB | # session leader
             win32process.CREATE_NEW_PROCESS_GROUP |  # group leader
             win32process.DETACHED_PROCESS |          # no controlling terminal
             priority)
    info = win32process.STARTUPINFO()
    win32process.CreateProcess(executable, cmdline, None, None,
                               inherit, flags, None, None, info)
    # Do what exec* functions do, let the OS do the cleanup.
    os._exit(0)



def daemonize2():
    args = [sys.argv[1], "--nodaemon"] + sys.argv[2:]
    executable = sys.executable
    cmdline = win32.quoteArguments(getPythonArgs() + args)
    inherit = True
    priority = win32process.GetPriorityClass(win32process.GetCurrentProcess())
    flags = (win32process.CREATE_NO_WINDOW | # create an invisible console
             win32process.CREATE_NEW_PROCESS_GROUP | # group leader
             priority)
    attributes = win32security.SECURITY_ATTRIBUTES()
    attributes.bInheritHandle = True
    station = win32service.CreateWindowStation(None, 0,
                                               win32con.GENERIC_READ |
                                               win32con.GENERIC_WRITE,
                                               attributes)
    station.SetProcessWindowStation()
    sname = win32service.GetUserObjectInformation(station,
                                                  win32service.UOI_NAME)
    dname = str(os.getpid())
    desktop = win32service.CreateDesktop(dname, 0,
                                         win32con.GENERIC_READ |
                                         win32con.GENERIC_WRITE,
                                         attributes)
    desktop.SetThreadDesktop()
    null = os.open("NUL", os.O_RDWR)
    handle = msvcrt.get_osfhandle(null)
    info = win32process.STARTUPINFO()
    info.lpDesktop = "%s\\%s" % (sname, dname)
    info.dwFlags = win32process.STARTF_USESTDHANDLES
    info.hStdInput = info.hStdOutput = info.hStdError = handle
    win32process.CreateProcess(executable, cmdline, None, None,
                               inherit, flags, None, None, info)
    # Same as above, exit as fast as posible.
    os._exit(0)



if __name__ == "__main__":
    daemonize2()
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to