[tor-commits] [arm/master] PID resolution fallbacks by ps and lsof

atagar at torproject.org atagar at torproject.org
Tue Apr 26 02:53:05 UTC 2011


commit c62e15023f3f6fe791a5f6fc21f070c6e8f857fb
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Apr 25 19:52:07 2011 -0700

    PID resolution fallbacks by ps and lsof
    
    On Macs all of the current pid resolution tactics fails, so adding a couple
    more that work on that platform.
---
 src/util/torTools.py |   28 ++++++++++++++++++++++++++++
 1 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/src/util/torTools.py b/src/util/torTools.py
index 0eebd20..08b04c0 100644
--- a/src/util/torTools.py
+++ b/src/util/torTools.py
@@ -122,6 +122,8 @@ def getPid(controlPort=9051, pidFilePath=None):
   4. "netstat -npl | grep 127.0.0.1:%s" % <tor control port>
   5. "ps -o pid -C tor"
   6. "sockstat -4l -P tcp -p %i | grep tor" % <tor control port>
+  7. "ps axc | egrep \" tor$\""
+  8. "lsof -wnPi | egrep \"^tor.*:%i\"" % <tor control port>
   
   If pidof or ps provide multiple tor instances then their results are
   discarded (since only netstat can differentiate using the control port). This
@@ -201,6 +203,32 @@ def getPid(controlPort=9051, pidFilePath=None):
       if pid.isdigit(): return pid
   except IOError: pass
   
+  # attempts to resolve via a ps command that works on the mac (this and lsof
+  # are the only resolvers to work on that platform). This fails if:
+  # - tor's running under a different name
+  # - there's multiple instances of tor
+  
+  try:
+    results = sysTools.call("ps axc | egrep \" tor$\"")
+    if len(results) == 1 and len(results[0].split()) > 0:
+      pid = results[0].split()[0]
+      if pid.isdigit(): return pid
+  except IOError: pass
+  
+  # attempts to resolve via lsof - this should work on linux, mac, and bsd -
+  # this fails if:
+  # - tor's running under a different name
+  # - tor's being run as a different user due to permissions
+  # - there are multiple instances of Tor, using the
+  #   same control port on different addresses.
+  
+  try:
+    results = sysTools.call("lsof -wnPi | egrep \"^tor.*:%i\"" % controlPort)
+    if len(results) == 1 and len(results[0].split()) > 1:
+      pid = results[0].split()[1]
+      if pid.isdigit(): return pid
+  except IOError: pass
+  
   return None
 
 def getBsdJailId():



More information about the tor-commits mailing list