This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: My PyLucene app freezes when run as a daemon


Ofer Nave wrote:
This might be a bit off the usual topic range here, but I was pointed to
this list.

Background:

PyLucene is a GCJ-compiled version of Java Lucene integrated with Python.
http://pylucene.osafoundation.org/

Context:

I have a PyLucene searcher application running under a multithreaded python
web server called Paste (http://pythonpaste.org).  I've added a command-line
argument to my script to run the script as a daemon based on the code in
this article: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731

Problem:

When the script is run as a normal process, it works fine.  When it is run
as a daemon, it freezes after about a dozen requests.  The point it's
freezing at is in a call to a class that is known to not be thread-safe, so
that might be the problem - but on the other hand, the only difference
between the good and bad scenarios is whether it's running as a daemon, so I
tend to lean towards that as my top clue.

How I Got Here:

I posted this to the PyLucene list, and was told: "You might want to ask
java@gcc.gnu.org about daemonizing a process using libgcj and boehm-gc."  So
I'm giving it a shot.  Does anyone have wisdom on the care and feeding of
daemonized processes built with GCJ?  Is there anything special I need to
know about?

Appendix 1 - My daemonize() Function:

# call to detach yourself from a terminal
def daemonize(logfile=None):
    # fork twice to sever any ties
    _fork()
    os.setsid()
    _fork()
    os.chdir(WORKDIR)
    os.umask(UMASK)

    # close standard I/O channels
    os.close(0)  # stdin
    os.close(1)  # stdout
    os.close(2)  # stderr

    # redirect standard output channels to logfile
    if logfile:
        sys.stdout = sys.stderr = logfile

    # set up SIGTERM handler for cleanup
    signal(SIGTERM, _sigterm_handler)

-ofer


It would not surprise me if that caused problems. Does it work with Sun's runtime?


If you want to daemonize, I would recommend doing it in C code before calling JvRunMain. I am also unsure what happens if you close stdout and stderr. I would hope that you don't do anything that would cause libgcj to try to write to those descriptors. It might help to open stdout and stderr to /dev/null

Other that that I would recommend attaching gdb to it to see where it is stuck.

David Daney


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]