X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=python%2Fovs%2Fdaemon.py;h=4e54e697fabe6f7c923cbcddadccd70e037533e0;hb=fcaddd4dd1e8feefc09ea2664ad51fb669d136f8;hp=83ae8cd1398d22f31a410ce94a1db78741e075e5;hpb=2159de839136af40641738284c7eabde1b0fc72b;p=openvswitch diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py index 83ae8cd1..4e54e697 100644 --- a/python/ovs/daemon.py +++ b/python/ovs/daemon.py @@ -111,37 +111,15 @@ def set_monitor(): global _monitor _monitor = True -def _already_running(): - """If a pidfile has been configured and that pidfile already exists and is - locked by a running process, returns True. Otherwise, returns False.""" - if _pidfile is not None: - try: - file = open(_pidfile, "r+") - try: - try: - fcntl.lockf(file, fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError, e: - if e.errno in [errno.EACCES, errno.EAGAIN]: - return True - logging.error("error locking %s (%s)" - % (_pidfile, os.strerror(e.errno))) - return False - finally: - # This releases the lock, which we don't really want. - file.close() - except IOError, e: - if e.errno == errno.ENOENT: - return False - logging.error("error opening %s (%s)" - % (_pidfile, os.strerror(e.errno))) - return False - def die_if_already_running(): """If a locked pidfile exists, issue a warning message and, unless ignore_existing_pidfile() has been called, terminate the program.""" - if _already_running(): + if _pidfile is None: + return + pid = read_pidfile_if_exists(_pidfile) + if pid > 0: if not _overwrite_pidfile: - msg = "%s: already running" % _pidfile + msg = "%s: already running as pid %d" % (_pidfile, pid) logging.error("%s, aborting" % msg) sys.stderr.write("%s\n" % msg) sys.exit(1) @@ -382,9 +360,7 @@ Daemon options: --overwrite-pidfile with --pidfile, start even if already running """ % (ovs.dirs.RUNDIR, ovs.util.PROGRAM_NAME)) -def read_pidfile(pidfile): - """Opens and reads a PID from 'pidfile'. Returns the nonnegative PID if - successful, otherwise a negative errno value.""" +def __read_pidfile(pidfile, must_exist): if _pidfile_dev is not None: try: s = os.stat(pidfile) @@ -401,6 +377,8 @@ def read_pidfile(pidfile): try: file = open(pidfile, "r") except IOError, e: + if e.errno == errno.ENOENT and not must_exist: + return 0 logging.warning("%s: open: %s" % (pidfile, os.strerror(e.errno))) return -e.errno @@ -437,6 +415,16 @@ def read_pidfile(pidfile): except IOError: pass +def read_pidfile(pidfile): + """Opens and reads a PID from 'pidfile'. Returns the positive PID if + successful, otherwise a negative errno value.""" + return __read_pidfile(pidfile, True) + +def read_pidfile_if_exists(pidfile): + """Opens and reads a PID from 'pidfile'. Returns 0 if 'pidfile' does not + exist, the positive PID if successful, otherwise a negative errno value.""" + return __read_pidfile(pidfile, False) + # XXX Python's getopt does not support options with optional arguments, so we # have to separate --pidfile (with no argument) from --pidfile-name (with an # argument). Need to write our own getopt I guess.