Метод os.Process.Wait
Метод os.Process.Wait ожидает завершения процесса,
после чего возвращает структуру os.ProcessState,
содержащую информацию о завершении процесса, и ошибку,
если таковая возникла. Метод блокирует выполнение программы
до тех пор, пока процесс не завершится.
Синтаксис
state, err := process.Wait()
Пример
Давайте запустим внешнюю команду с помощью os.StartProcess
и дождемся ее завершения:
package 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())
}
Результат выполнения кода:
"Hello, World!"
"Process finished: true"
Пример
Давайте запустим процесс и проверим код его завершения:
package 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())
}
Результат выполнения кода:
"Exit code: 42"
Пример
Метод os.Process.Wait также может использоваться
в связке с методом os.Process.Kill для ожидания
принудительного завершения процесса:
package 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())
}
Результат выполнения кода:
"Process exited: true"
"Success: false"
Смотрите также
-
метод
os.Process.Kill,
который принудительно завершает процесс -
метод
os.Process.Signal,
который отправляет сигнал процессу -
метод
os.Process.Release,
который освобождает ресурсы процесса -
метод
os.ProcessState.ExitCode,
который возвращает код завершения процесса