Метод os.Process.Kill

Метод os.Process.Kill завершает процесс, отправляя ему сигнал SIGKILL (в Unix-подобных системах) или аналогичный сигнал принудительного завершения в Windows. Этот метод не передает процессу возможности корректно завершить работу — он немедленно убивает процесс. В качестве приемника метод принимает указатель на структуру os.Process, полученную при запуске процесса через os.StartProcess или os.FindProcess. Метод возвращает ошибку, если завершить процесс не удалось.

Синтаксис

goerr := p.Kill()

Пример

Давайте запустим внешнюю программу, которая выполняется 5 секунд, и завершим ее принудительно через 1 секунду:

gopackage main

import (
  "fmt"
  "os"
  "os/exec"
  "time"
)

func main() {
  cmd := exec.Command("sleep", "5")
  if err := cmd.Start(); err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  time.Sleep(1 * time.Second)

  if err := cmd.Process.Kill(); err != nil {
    fmt.Println("Error killing process:", err)
    return
  }

  fmt.Println("Process killed successfully")
}

Результат выполнения кода:

go"Process killed successfully"

В этом примере программа sleep 5 была запущена, но через секунду была принудительно завершена методом Kill, не дожидаясь естественного окончания.

Пример

Давайте попробуем завершить уже завершенный процесс и обработаем ошибку:

gopackage main

import (
  "fmt"
  "os"
  "os/exec"
  "time"
)

func main() {
  cmd := exec.Command("sleep", "1")
  if err := cmd.Start(); err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  time.Sleep(2 * time.Second)

  if err := cmd.Process.Kill(); err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Process killed")
}

Результат выполнения кода:

go"Error: os: process already finished"

Здесь мы видим, что попытка завершить уже завершившийся процесс приводит к ошибке, которую нужно корректно обрабатывать в программе.

Пример

Давайте используем метод Kill вместе с Wait для дожидания завершения процесса после отправки сигнала:

gopackage main

import (
  "fmt"
  "os/exec"
  "time"
)

func main() {
  cmd := exec.Command("sleep", "10")
  if err := cmd.Start(); err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  go func() {
    time.Sleep(2 * time.Second)
    if err := cmd.Process.Kill(); err != nil {
      fmt.Println("Kill error:", err)
    }
  }()

  if err := cmd.Wait(); err != nil {
    fmt.Println("Wait error:", err)
  }

  fmt.Println("Process finished")
}

Результат выполнения кода:

go"Wait error: signal: killed"
"Process finished"

В этом примере метод Wait возвращает ошибку сигнала killed, что подтверждает факт принудительного завершения процесса.

Смотрите также

  • метод os.Process.Signal,
    который отправляет произвольный сигнал процессу
  • метод os.Process.Wait,
    который ожидает завершения процесса
  • функцию os.FindProcess,
    которая находит процесс по PID
  • функцию os.Process.Release,
    которая освобождает ресурсы процесса