[tor-commits] [stem/master] System utility for getting process start times
atagar at torproject.org
atagar at torproject.org
Wed May 29 15:22:57 UTC 2013
commit 24d9377cdc2d1ee3531238b825621934053bae9f
Author: Damian Johnson <atagar at torproject.org>
Date: Tue May 28 09:32:13 2013 -0700
System utility for getting process start times
Adding a get_start_time() to the system utils to provide the unix timestamp for
when a given pid started.
---
stem/util/system.py | 29 +++++++++++++++++++++++++++++
test/integ/util/system.py | 29 +++++++++++++++++++++++++++++
2 files changed, 58 insertions(+)
diff --git a/stem/util/system.py b/stem/util/system.py
index 6b767c7..e760ae5 100644
--- a/stem/util/system.py
+++ b/stem/util/system.py
@@ -20,6 +20,7 @@ best-effort, providing **None** if the lookup fails.
get_pid_by_port - gets the pid for a process listening to a given port
get_pid_by_open_file - gets the pid for the process with an open file
get_cwd - provides the current working directory for a given process
+ get_start_time - provides the unix timestamp when the process started
get_bsd_jail_id - provides the BSD jail id a given process is running within
expand_path - expands relative paths and ~ entries
call - runs the given system command and provides back the results
@@ -530,6 +531,7 @@ def get_cwd(pid):
Provides the working directory of the given process.
:param int pid: process id of the process to be queried
+
:returns: **str** with the absolute path for the process' present working
directory, **None** if it can't be determined
"""
@@ -593,6 +595,33 @@ def get_cwd(pid):
return None # all queries failed
+def get_start_time(pid):
+ """
+ Provides the unix timestamp when the given process started.
+
+ :param int pid: process id of the process to be queried
+
+ :returns: **float** for the unix timestamp when the process began, **None**
+ if it can't be determined
+ """
+
+ if stem.util.proc.is_available():
+ try:
+ return float(stem.util.proc.get_stats(pid, stem.util.proc.Stat.START_TIME)[0])
+ except IOError:
+ pass
+
+ try:
+ ps_results = stem.util.system.call("ps -p %s -o etime" % pid)
+
+ if ps_results and len(ps_results) >= 2:
+ etime = ps_results[1].strip()
+ return time.time() - stem.util.str_tools.parse_short_time_label(etime)
+ except:
+ pass
+
+ return None
+
def get_bsd_jail_id(pid):
"""
Gets the jail id for a process. These seem to only exist for FreeBSD (this
diff --git a/test/integ/util/system.py b/test/integ/util/system.py
index 63486a4..1392dfd 100644
--- a/test/integ/util/system.py
+++ b/test/integ/util/system.py
@@ -8,6 +8,7 @@ import os
import tempfile
import unittest
+import stem.util.proc
import stem.util.system
import test.runner
@@ -382,6 +383,34 @@ class TestSystem(unittest.TestCase):
runner_pid, tor_cwd = runner.get_pid(), runner.get_tor_cwd()
self.assertEquals(tor_cwd, stem.util.system.get_cwd(runner_pid))
+ def test_get_start_time_proc(self):
+ """
+ Tests the get_start_time function with a proc response.
+ """
+
+ if not stem.util.proc.is_available():
+ test.runner.skip(self, "(proc unavailable)")
+ return
+
+ mocking.mock(stem.util.system.call, filter_system_call(['ps ']))
+
+ pid = test.runner.get_runner().get_pid()
+ self.assertTrue(stem.util.system.get_start_time(pid) >= 0)
+
+ def test_get_start_time_ps(self):
+ """
+ Tests the get_start_time function with a ps response.
+ """
+
+ if not stem.util.system.is_available("ps"):
+ test.runner.skip(self, "(ps unavailable)")
+ return
+
+ mocking.mock(stem.util.proc.is_available, mocking.return_false())
+
+ pid = test.runner.get_runner().get_pid()
+ self.assertTrue(stem.util.system.get_start_time(pid) >= 0)
+
def test_get_bsd_jail_id(self):
"""
Exercises the stem.util.system.get_bsd_jail_id function, running through
More information about the tor-commits
mailing list