redundant
[dumbwifi.git] / procs.py
blobc6475700e1b02d4071e1c59eaf548e4a3ff61818
1 # Author: Martin Matusiak <numerodix@gmail.com>
2 # Licensed under the GNU Public License, version 3.
4 import popen2
5 import os
6 import signal
7 import string
8 import sys
9 import time
11 from conf import config
12 from output import logger
13 import regex
14 import system
17 # Manage processes
19 def execute(cmd):
20 process = popen2.Popen3(cmd, True)
21 sout = process.fromchild
22 serr = process.childerr
23 code = process.wait()
24 return (code, sout, serr)
26 def run(cmd):
27 #logger.display("+ " + cmd, log=False)
28 cmd = "LC_ALL=C %s" % cmd
29 logger.log("+ %s" % cmd)
30 (code, sout, serr) = execute(cmd)
31 o = ""
32 if code != 0:
33 e = serr.read().strip()
34 if e: logger.err(e)
35 else:
36 o = sout.read()
37 logger.log(o)
38 return o
40 def kill_by_name(proc):
41 cmd = "%s %s" % (config.pgrep, os.path.basename(proc))
42 out = run(cmd).strip()
43 deadline = time.time()+0.3
44 while out and time.time() < deadline:
45 pids = string.split(out, "\n")
46 for p in pids:
47 pid = -1
48 try: pid = int(p)
49 except ValueError:
50 logger.err("Cast of pid int('%s') for process '%s' failed" % (p, proc))
51 return
52 try:
53 os.kill(pid, signal.SIGINT)
54 os.kill(pid, signal.SIGTERM)
55 os.kill(pid, signal.SIGKILL)
56 except OSError:
57 logger.err("Failed to kill process '%s' pid %d" % (proc, pid))
58 return
59 out = run(cmd).strip()
61 def kill_previous_instances():
62 pids = system.getfile(config.pidfile).strip().split("\n")
63 if not [x for x in pids if x != ""]: return
65 # truncate pidfile
66 try: f = open(config.pidfile, 'w'); f.close()
67 except IOError:
68 logger.err("Could not truncate pidfile %s" % config.pidfile, log=False)
70 for pid in pids:
71 pid = int(pid)
72 out = run("%s %s" % (config.ps, pid))
73 active = regex.find1("(%s)" % config.program_name, out)
74 if out and active:
75 os.kill(pid, signal.SIGINT)
76 os.kill(pid, signal.SIGTERM)
77 os.kill(pid, signal.SIGKILL)
79 def write_pid():
80 try:
81 f = open(config.pidfile, 'a')
82 f.write("%s\n" % os.getpid())
83 f.close()
84 except IOError:
85 logger.err("Could not write to pidfile %s" % config.pidfile, log=False)
87 def daemonize():
88 # do unix double fork
89 try:
90 pid = os.fork()
91 if pid > 0: sys.exit(0)
92 except OSError:
93 logger.err("Failed to daemonize", log=False)
94 sys.exit(1)
96 os.chdir("/")
97 os.setsid()
98 os.umask(0)
99 child_in =open('/dev/null','r')
100 child_out=open('/dev/null','w')
101 os.dup2(child_in.fileno(), sys.stdin.fileno())
102 os.dup2(child_out.fileno(), sys.stdout.fileno())
103 os.dup2(child_out.fileno(), sys.stderr.fileno())
105 try:
106 pid = os.fork()
107 if pid > 0: sys.exit(0)
108 except OSError:
109 logger.err("Failed to daemonize", log=False)
110 sys.exit(1)