Метод os.Process.Wait

Метод os.Process.Wait ожидает завершения процесса, после чего возвращает структуру os.ProcessState, содержащую информацию о завершении процесса, и ошибку, если таковая возникла. Метод блокирует выполнение программы до тех пор, пока процесс не завершится.

Синтаксис

gostate, err := process.Wait()

Пример

Давайте запустим внешнюю команду с помощью os.StartProcess и дождемся ее завершения:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  attr := &os.ProcAttr{
    Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  }
  
  process, err := os.StartProcess("/bin/echo", []string{"echo", "Hello, World!"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }
  
  state, err := process.Wait()
  if err != nil {
    fmt.Println("Error waiting process:", err)
    return
  }
  
  fmt.Println("Process finished:", state.Exited())
}

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

go"Hello, World!"
"Process finished: true"

Пример

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

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  attr := &os.ProcAttr{
    Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
  }
  
  process, err := os.StartProcess("/bin/sh", []string{"sh", "-c", "exit 42"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }
  
  state, err := process.Wait()
  if err != nil {
    fmt.Println("Error waiting process:", err)
    return
  }
  
  fmt.Println("Exit code:", state.ExitCode())
}

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

go"Exit code: 42"

Пример

Метод os.Process.Wait также может использоваться в связке с методом os.Process.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/sh", []string{"sh", "-c", "sleep 10"}, attr)
  if err != nil {
    fmt.Println("Error starting process:", err)
    return
  }
  
  go func() {
    time.Sleep(2 * time.Second)
    err := process.Kill()
    if err != nil {
      fmt.Println("Error killing process:", err)
    }
  }()
  
  state, err := process.Wait()
  if err != nil {
    fmt.Println("Error waiting process:", err)
    return
  }
  
  fmt.Println("Process exited:", state.Exited())
  fmt.Println("Success:", state.Success())
}

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

go"Process exited: true"
"Success: false"

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

  • метод os.Process.Kill,
    который принудительно завершает процесс
  • метод os.Process.Signal,
    который отправляет сигнал процессу
  • метод os.Process.Release,
    который освобождает ресурсы процесса
  • метод os.ProcessState.ExitCode,
    который возвращает код завершения процесса