[tor-commits] [stem/master] Add function pids_by_user()

atagar at torproject.org atagar at torproject.org
Mon Feb 1 04:21:04 UTC 2016


commit ae178869ee37a1ec78e6b7ef511b54ca4f74863e
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Jan 30 14:35:52 2016 -0800

    Add function pids_by_user()
    
    Simple utility for the system module to get pids for a user.
---
 docs/change_log.rst       |  1 +
 stem/util/system.py       | 31 +++++++++++++++++++++++++++++++
 test/integ/util/system.py | 10 ++++++++++
 3 files changed, 42 insertions(+)

diff --git a/docs/change_log.rst b/docs/change_log.rst
index 74159e2..81bf5a2 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -77,6 +77,7 @@ The following are only available within Stem's `git repository
   * Allow :func:`stem.util.conf.Config.set` to remove values when provided with a **None** value
   * Additional information when :func:`~stem.util.system.call` fails through a :class:`~stem.util.system.CallError`
   * Added an **is_ipv6** value to :class:`~stem.util.connection.Connection` instances
+  * Added :func:`~stem.util.system.pids_by_user`
   * Added :func:`~stem.util.__init__.datetime_to_unix`
 
  * **Interpreter**
diff --git a/stem/util/system.py b/stem/util/system.py
index 14516b2..b9baa28 100644
--- a/stem/util/system.py
+++ b/stem/util/system.py
@@ -27,6 +27,7 @@ best-effort, providing **None** if the lookup fails.
   pid_by_name - gets the pid for a process by the given name
   pid_by_port - gets the pid for a process listening to a given port
   pid_by_open_file - gets the pid for the process with an open file
+  pids_by_user - provides processes owned by a user
   cwd - provides the current working directory for a given process
   user - provides the user a process is running under
   start_time - provides the unix timestamp when the process started
@@ -84,6 +85,7 @@ GET_PID_BY_PORT_NETSTAT = 'netstat -npltu'
 GET_PID_BY_PORT_SOCKSTAT = 'sockstat -4l -P tcp -p %s'
 GET_PID_BY_PORT_LSOF = 'lsof -wnP -iTCP -sTCP:LISTEN'
 GET_PID_BY_FILE_LSOF = 'lsof -tw %s'
+GET_PIDS_BY_USER = 'ps -o pid -u %s'
 GET_CWD_PWDX = 'pwdx %s'
 GET_CWD_LSOF = 'lsof -a -p %s -d cwd -Fn'
 GET_BSD_JAIL_ID_PS = 'ps -p %s -o jid'
@@ -640,6 +642,35 @@ def pid_by_open_file(path):
   return None  # all queries failed
 
 
+def pids_by_user(user):
+  """
+  Provides processes owned by a given user.
+
+  .. versionadded:: 1.5.0
+
+  :param str user: user to look up processes for
+
+  :returns: **list** with the process ids, **None** if it can't be determined
+  """
+
+  # example output:
+  #   atagar at odin:~$ ps -o pid -u avahi
+  #     PID
+  #     914
+  #     915
+
+  if is_available('ps'):
+    results = call(GET_PIDS_BY_USER % user, None)
+
+    if results:
+      try:
+        return list(map(int, results[1:]))
+      except ValueError:
+        pass
+
+  return None
+
+
 def cwd(pid):
   """
   Provides the working directory of the given process.
diff --git a/test/integ/util/system.py b/test/integ/util/system.py
index 1d36b5f..3207f9d 100644
--- a/test/integ/util/system.py
+++ b/test/integ/util/system.py
@@ -366,6 +366,16 @@ class TestSystem(unittest.TestCase):
     os.rmdir(tmpdir)
     self.assertEqual(None, stem.util.system.pid_by_open_file(tmpdir))
 
+  def test_pids_by_user(self):
+    """
+    Checks the stem.util.system.pids_by_user function.
+    """
+
+    # our own pid should be among the processes for our user
+
+    pids = stem.util.system.pids_by_user(getpass.getuser())
+    self.assertTrue(os.getpid() in pids)
+
   def test_cwd(self):
     """
     Checks general usage of the stem.util.system.cwd function.





More information about the tor-commits mailing list