A zombie process cannot be killed—even with `SIGKILL`—because it has already exited. It remains in the process table only because its parent has not collected its exit status.
1. Confirm it is a zombie (`STAT` contains `Z`):
```bash
ps -o pid,ppid,stat,cmd -p <PID>
```
2. Find its parent:
```bash
ps -p <PID> -o ppid=
```
3. Ask the parent to reap exited children:
```bash
kill -SIGCHLD <PPID>
```
4. If that does not work, gracefully restart or terminate the parent:
```bash
kill -SIGTERM <PPID>
```
As a last resort:
```bash
kill -SIGKILL <PPID>
```
When the parent exits, the zombie is normally adopted and reaped by PID 1 or a subreaper. Be careful: killing the parent may disrupt a service, so prefer restarting it through its service manager:
```bash
sudo systemctl restart <service>
```
If the process state is `D` rather than `Z`, it is not a zombie—it is stuck in uninterruptible I/O, and signals generally will not take effect until the kernel operation returns; resolving the storage/network/kernel issue or rebooting may be necessary.