Метод os.Process.Signal

Метод os.Process.Signal отправляет сигнал процессу, представленному объектом os.Process. В первый параметр метод принимает сигнал типа os.Signal, который нужно отправить процессу. Метод возвращает ошибку error, если отправка сигнала не удалась.

Синтаксис

goerr := process.Signal(sig)

Пример

Давайте отправим сигнал os.Interrupt процессу, который был запущен с помощью os.StartProcess:

gopackage main

import (
  "fmt"
  "os"
  "time"
)

func main() {
  attr := &os.ProcAttr{
    Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  }

  process, err := os.StartProcess("/bin/sleep", []string{"sleep", "30"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  time.Sleep(2 * time.Second)

  err = process.Signal(os.Interrupt)
  if err != nil {
    fmt.Println("Error sending signal:", err)
    return
  }

  fmt.Println("Signal sent successfully")
}

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

go"Signal sent successfully"

Пример

Давайте отправим сигнал os.Kill процессу для его немедленного завершения:

gopackage main

import (
  "fmt"
  "os"
  "time"
)

func main() {
  attr := &os.ProcAttr{
    Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  }

  process, err := os.StartProcess("/bin/sleep", []string{"sleep", "60"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  time.Sleep(1 * time.Second)

  err = process.Signal(os.Kill)
  if err != nil {
    fmt.Println("Error sending signal:", err)
    return
  }

  fmt.Println("Kill signal sent successfully")
}

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

go"Kill signal sent successfully"

Пример

Давайте отправим пользовательский сигнал syscall.SIGTERM процессу и проверим его состояние:

gopackage main

import (
  "fmt"
  "os"
  "syscall"
  "time"
)

func main() {
  attr := &os.ProcAttr{
    Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  }

  process, err := os.StartProcess("/bin/sleep", []string{"sleep", "45"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }

  time.Sleep(2 * time.Second)

  err = process.Signal(syscall.SIGTERM)
  if err != nil {
    fmt.Println("Error sending signal:", err)
    return
  }

  state, err := process.Wait()
  if err != nil {
    fmt.Println("Error waiting for process:", err)
    return
  }

  fmt.Printf("Process exited with status: %d", state.ExitCode())
}

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

go"Process exited with status: 143"

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

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