Тип os.ProcessState

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

Основные методы

Тип os.ProcessState предоставляет следующие основные методы: Exited - проверяет, завершился ли процесс, ExitCode - возвращает код завершения процесса, Success - проверяет, завершился ли процесс успешно (с кодом 0), Sys - возвращает системную информацию о процессе, SysUsage - возвращает информацию об использовании ресурсов, UserTime - возвращает время, затраченное процессом в пользовательском режиме, SystemTime - возвращает время, затраченное процессом в системном режиме, Pid - возвращает идентификатор процесса.

Синтаксис

gotype ProcessState struct {
  // содержит скрытые поля
}

Пример получения кода завершения

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

gopackage main

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

func main() {
  cmd := exec.Command("ls", "/")
  err := cmd.Run()
  if err != nil {
    if exitError, ok := err.(*exec.ExitError); ok {
      state := exitError.ProcessState
      fmt.Printf("Process exited with code: %d\n", state.ExitCode())
      fmt.Printf("Success: %v\n", state.Success())
      fmt.Printf("Exited: %v\n", state.Exited())
    }
  } else {
    state := cmd.ProcessState
    fmt.Printf("Process exited with code: %d\n", state.ExitCode())
    fmt.Printf("Success: %v\n", state.Success())
  }
}

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

go"Process exited with code: 0"
"Success: true"
"Exited: true"

Пример получения времени выполнения

Давайте получим информацию о времени выполнения процесса:

gopackage main

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

func main() {
  start := time.Now()
  cmd := exec.Command("sleep", "1")
  err := cmd.Run()
  if err == nil {
    state := cmd.ProcessState
    userTime := state.UserTime()
    systemTime := state.SystemTime()
    fmt.Printf("User time: %v\n", userTime)
    fmt.Printf("System time: %v\n", systemTime)
    fmt.Printf("Total time: %v\n", time.Since(start))
  }
}

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

go"User time: 5ms"
"System time: 2ms"
"Total time: 1.05s"

Пример получения системной информации

Давайте получим системную информацию о процессе:

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("echo", "hello")
  err := cmd.Run()
  if err == nil {
    state := cmd.ProcessState
    sysInfo := state.Sys()
    fmt.Printf("System info: %v\n", sysInfo)
    fmt.Printf("PID: %d\n", state.Pid())
  }
}

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

go"System info: &{32683 0 0 0}"
"PID: 32683"

Пример обработки ошибки выполнения

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

gopackage main

import (
  "fmt"
  "os/exec"
)

func main() {
  cmd := exec.Command("false")
  err := cmd.Run()
  if err != nil {
    if exitError, ok := err.(*exec.ExitError); ok {
      state := exitError.ProcessState
      fmt.Printf("Error occurred: %v\n", err)
      fmt.Printf("Exit code: %d\n", state.ExitCode())
      fmt.Printf("Success: %v\n", state.Success())
    }
  }
}

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

go"Error occurred: exit status 1"
"Exit code: 1"
"Success: false"

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

  • тип os.Process,
    который представляет запущенный процесс и позволяет управлять им
  • метод os.Process.Wait,
    который ожидает завершения процесса и возвращает его состояние
  • тип exec.ExitError,
    который представляет ошибку завершения процесса с ненулевым кодом
  • метод exec.Cmd.Run,
    который запускает команду и ожидает ее завершения