| 132 | |
| 133 | |
| 134 | def daemon_stop(pid_file): |
| 135 | import errno |
| 136 | try: |
| 137 | with open(pid_file) as f: |
| 138 | buf = f.read() |
| 139 | pid = common.to_str(buf) |
| 140 | if not buf: |
| 141 | logging.error('not running') |
| 142 | except IOError as e: |
| 143 | shell.print_exception(e) |
| 144 | if e.errno == errno.ENOENT: |
| 145 | # always exit 0 if we are sure daemon is not running |
| 146 | logging.error('not running') |
| 147 | return |
| 148 | sys.exit(1) |
| 149 | pid = int(pid) |
| 150 | if pid > 0: |
| 151 | try: |
| 152 | os.kill(pid, signal.SIGTERM) |
| 153 | except OSError as e: |
| 154 | if e.errno == errno.ESRCH: |
| 155 | logging.error('not running') |
| 156 | # always exit 0 if we are sure daemon is not running |
| 157 | return |
| 158 | shell.print_exception(e) |
| 159 | sys.exit(1) |
| 160 | else: |
| 161 | logging.error('pid is not positive: %d', pid) |
| 162 | |
| 163 | # sleep for maximum 10s |
| 164 | for i in range(0, 200): |
| 165 | try: |
| 166 | # query for the pid |
| 167 | os.kill(pid, 0) |
| 168 | except OSError as e: |
| 169 | if e.errno == errno.ESRCH: |
| 170 | break |
| 171 | time.sleep(0.05) |
| 172 | else: |
| 173 | logging.error('timed out when stopping pid %d', pid) |
| 174 | sys.exit(1) |
| 175 | print('stopped') |
| 176 | os.unlink(pid_file) |
| 177 | |
| 178 | |
| 179 | def set_user(username): |