Attempt to kill the whole process tree on timeout
### Expected Behavior

In case of timeout, the Bash task tries to kill the whole spawned process tree.

### Actual Behaviour

In case of timeout, the Bash task kills only the started initial process.

This results in any child processes spawned by the parent process remain running - effectively avoiding the timeout restriction.

### Steps To Reproduce

1. Define a task using `io.kestra.core.tasks.scripts.Bash` running a script
2. Set a reasonable `timeout` for the task
3. Make the script run a long running action (`sleep`, etc.)
4. Run the flow
5. List running processes
6. Wait for the Bash task to hit the timeout
7. List running processes again

### Environment Information

- Kestra Version: 0.8.0-SNAPSHOT
- Operating System (OS / Docker / Kubernetes): CentOS
- Java Version (If not docker): openjdk version "11.0.18" 2023-01-17 LTS


### Example flow

``` yaml
id: BashTest
namespace: io.kestra.tests
description: Test if the Bash processes tree gets killed properly.
disabled: false

tasks:
  - id: long-running-task
    type: io.kestra.core.tasks.scripts.Bash
    description: "Long Bash task gets killed on timeout"
    commands:
      - "/tmp/sleep.sh"
 
taskDefaults:
  - type: io.kestra.core.tasks.scripts.Bash
    values:
      interpreter: /bin/bash
      timeout: PT5S
```

```bash
#!/bin/bash

sleep 100
```
core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java
core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java
diff --git a/core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java b/core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java
index b3281a01ff..5669b063fa 100644
--- a/core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java
+++ b/core/src/main/java/io/kestra/core/tasks/scripts/runners/ProcessBuilderScriptRunner.java
@@ -72,8 +72,17 @@ public RunResult run(
             return new RunResult(exitCode, stdOut, stdErr);
         } catch (InterruptedException e) {
             logger.warn("Killing process {} for InterruptedException", pid);
+            killDescendantsOf(process.toHandle(), logger);
             process.destroy();
             throw e;
         }
     }
+
+    private void killDescendantsOf(ProcessHandle process, Logger logger) {
+        process.descendants().forEach(processHandle -> {
+            if (!processHandle.destroy()) {
+                logger.warn("Descendant process {} of {} couldn't be killed", processHandle.pid(), process.pid());
+            }
+        });
+    }
 }
