(pid: int, kill_timeout: float)
| 181 | |
| 182 | |
| 183 | def _terminate_pid(pid: int, kill_timeout: float) -> str: |
| 184 | if pid <= 0 or not _pid_alive(pid): |
| 185 | return "not_running" |
| 186 | try: |
| 187 | os.kill(pid, signal.SIGTERM) |
| 188 | except ProcessLookupError: |
| 189 | return "already_gone" |
| 190 | deadline = time.monotonic() + kill_timeout |
| 191 | while time.monotonic() < deadline: |
| 192 | if not _pid_alive(pid): |
| 193 | return "terminated" |
| 194 | time.sleep(0.1) |
| 195 | try: |
| 196 | os.kill(pid, signal.SIGKILL) |
| 197 | except ProcessLookupError: |
| 198 | return "already_gone" |
| 199 | time.sleep(0.2) |
| 200 | return "killed" if not _pid_alive(pid) else "still_alive" |
| 201 | |
| 202 | |
| 203 | def _cmd_release(args: argparse.Namespace) -> int: |
no test coverage detected