<html><body><div><br></div><div><br>On May 16, 2013, at 12:34 PM, Justin Venus &lt;justin.venus@gmail.com&gt; wrote:<br><br><div><blockquote type="cite"><div class="msg-quote"><p dir="ltr">IMO monit is pretty easy to setup and probably your best bet.&nbsp; However you could get puppet, chef, or cfengine to start processes for you.&nbsp; If you are feeling adventurous, you could set up something like apache mesos to keep your tasks running.</p><p dir="ltr">Justin Venus</p><div class="gmail_quote">On May 16, 2013 10:27 AM, "Jonathan Vanasco" &lt;<a href="mailto:twisted-python@2xlp.com" data-mce-href="mailto:twisted-python@2xlp.com">twisted-python@2xlp.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" data-mce-style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">Hi,<br> <br> i'm running a twisted daemon on ubuntu<br> <br> It seems to get shut down by the system periodically. &nbsp;Logs show that the kernel (or something) kills it for taking up too much memory. &nbsp;I definitely have coding issues in there that i'm working on to address this.<br> <br> Does anyone have a suggestion for tools I can easily use on ubuntu to monitor and restart if needed ? &nbsp;I haven't had to do something like this in 5 years, and back then it was a hassle to get monit or supervisord working.<br> <br> thanks<br> <br> /jonathan<br> _______________________________________________<br> Twisted-Python mailing list<br> <a href="mailto:Twisted-Python@twistedmatrix.com" data-mce-href="mailto:Twisted-Python@twistedmatrix.com">Twisted-Python@twistedmatrix.com</a><br> <a href="http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python" data-mce-href="http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python">http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python</a><br></blockquote></div><div class="_stretch">_______________________________________________<br> Twisted-Python mailing list<br> <a href="mailto:Twisted-Python@twistedmatrix.com" data-mce-href="mailto:Twisted-Python@twistedmatrix.com">Twisted-Python@twistedmatrix.com</a><br> <a href="http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python" data-mce-href="http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python">http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python</a></div></div></blockquote><span>&nbsp;</span><br><br>Another simple option is to use twisted's own procmon.ProcessMonitor to launch your twistd daemon.&nbsp; You can use it "out of the box", or implement your own service based upon it, e.g.,<br><br><br>from twisted.python import usage<br>from twisted.runner import procmon<br><br><br><br>class Options(usage.Options):<br>&nbsp;&nbsp;&nbsp; synopsis = '[mymonitor options] commandline'<br><br>&nbsp;&nbsp;&nbsp; optParameters = (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'threshold',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 't',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'How many seconds a process has to run before it is considered to have died instantly.',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'killtime',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'k',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'How many seconds a process being killed has to get its affairs in order before it gets killed with an unmaskable signal.',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'minrestartdelay',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'm',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'The minimum number of seconds to wait before attempting to restart a process.',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'maxrestartdelay',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'M',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3600,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'The maximum number of seconds to wait before attempting to restart a process.',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp; )<br><br>&nbsp;&nbsp;&nbsp; optFlags = ()<br><br><br>&nbsp;&nbsp;&nbsp; longdesc = """Blah blah blah"""<br><br>&nbsp;&nbsp;&nbsp; def parseArgs(self, *args):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Grab the command line that is going to be started and monitored<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self['args'] = args<br><br><br>&nbsp;&nbsp;&nbsp; def postOptions(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Check for dependencies.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(self['args']) &lt; 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise usage.UsageError('Please specify a process commandline')<br><br><br>def makeService(config):<br>&nbsp;&nbsp;&nbsp; from twisted.internet import reactor<br><br>&nbsp;&nbsp;&nbsp; myMonitorService = procmon.ProcessMonitor(reactor)<br><br>&nbsp;&nbsp;&nbsp; myMonitorService.threshold = config['threshold']<br>&nbsp;&nbsp;&nbsp; myMonitorService.killTime = config['killtime']<br>&nbsp;&nbsp;&nbsp; myMonitorService.minRestartDelay = config['minrestartdelay']<br>&nbsp;&nbsp;&nbsp; myMonitorService.maxRestartDelay = config['maxrestartdelay']<br>&nbsp;&nbsp;&nbsp; myMonitorService.addProcess(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'MyTwistedServiceThatSometimesBlowsUp',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config['args'],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid=None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gid=None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env={}<br>&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp; return myMonitorService<br><br><br>Hope this helps,<br><br>Daniel<br></div></div></body></html>