"""
Interface to the Sage cleaner
Triva Note: For the name "sage-cleaner", think of the
"The Cleaner" from Pulp Fiction:
http://www.frankjankowski.de/quiz/illus/keitel.jpg
"""
import os
from sage.misc.misc import SAGE_TMP
def cleaner(pid, cmd=''):
"""
Write a line to the ``spawned_processes`` file with the given
``pid`` and ``cmd``.
"""
if cmd != '':
cmd = cmd.strip().split()[0]
F = os.path.join(SAGE_TMP, 'spawned_processes')
try:
with open(F, 'a') as o:
o.write('%s %s\n'%(pid, cmd))
except IOError:
pass
else:
start_cleaner()
def start_cleaner():
"""
Start ``sage-cleaner`` in a new process group.
"""
if not os.fork():
os.setpgid(os.getpid(), os.getpid())
with open(os.devnull, "r+") as f:
os.dup2(f.fileno(), 0)
os.dup2(f.fileno(), 1)
os.dup2(f.fileno(), 2)
try:
maxopenfiles = os.sysconf("SC_OPEN_MAX")
if maxopenfiles <= 0:
raise ValueError
except ValueError:
maxopenfiles = 1024
os.closerange(3, maxopenfiles)
os.execlp("sage-cleaner", "sage-cleaner")