On Wed, 23 Jan 2008, Brad Nicholes wrote:
> I am running into another problem since the switch to popen2 in
> tcpconn.py. After running for several days, the tcpconn.py module died due
> to too many open files. The traceback points back to the popen2 call. Does
> anybody know what needs to be cleaned up? I saw some examples of having to
> close stdin. Do we need to close stdin, stdout and stderr? or is there
> something else that is missing.
Here is a patch that fixes the open fds and also allows you now to ctrl-c
the code:
diff -u tcpconn.py tcpconn.py.new
--- tcpconn.py 2008-01-23 11:43:05.000000000 -0800
+++ tcpconn.py.new 2008-01-23 11:44:30.000000000 -0800
@@ -32,6 +32,7 @@
import os, sys, popen2
import threading
+import select
import time
_WorkerThread = None #Worker thread object
@@ -174,14 +175,22 @@
'''This thread contunually gathers the current states of the tcp
socket
connections on the machine. The refresh rate is controlled by the
RefreshRate parameter that is passed in through th gmond.conf
file.'''
-
+
def __init__(self):
threading.Thread.__init__(self)
self.running = False
self.shuttingdown = False
+ self.popenChild = None
def shutdown(self):
self.shuttingdown = True
+ if self.popenChild != None:
+ try:
+ self.popenChild.wait()
+ except OSError, e:
+ if e.errno == 10: # No child processes
+ pass
+
if not self.running:
return
self.join()
@@ -210,9 +219,17 @@
tempconns[conn] = 0
#Call the netstat utility and split the output into separate
lines
- netstat_output=popen2.popen2(["netstat", '-t', '-a'],
mode='r')[0].read()
- lines = netstat_output.splitlines()
- os.wait()
+ fd_poll = select.poll()
+ self.popenChild = popen2.Popen3("netstat -t -a")
+ fd_poll.register(self.popenChild.fromchild)
+
+ poll_events = fd_poll.poll()
+
+ if (len(poll_events) == 0): # Timeout
+ continue
+
+ for (fd, events) in poll_events:
+ lines = self.popenChild.fromchild.readlines()
#Iterate through the netstat output looking for the 'tcp'
keyword in the tcp_at
# position and the state information in the tcp_state_at
position. Count each
@@ -284,11 +301,16 @@
#This code is for debugging and unit testing
if __name__ == '__main__':
- params = {'Refresh': '20'}
- metric_init(params)
- while True:
- for d in _descriptors:
- v = d['call_back'](d['name'])
- print 'value for %s is %u' % (d['name'], v)
- time.sleep(5)
+ try:
+ params = {'Refresh': '20'}
+ metric_init(params)
+ while True:
+ for d in _descriptors:
+ v = d['call_back'](d['name'])
+ print 'value for %s is %u' % (d['name'], v)
+ time.sleep(5)
+ except KeyboardInterrupt:
+ time.sleep(0.2)
+ os._exit(1)
+
>
> Brad
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Ganglia-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ganglia-developers
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Ganglia-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ganglia-developers