Метод os.Process.Kill
Метод os.Process.Kill завершает процесс, отправляя ему сигнал
SIGKILL (в Unix-подобных системах) или аналогичный сигнал
принудительного завершения в Windows. Этот метод не передает
процессу возможности корректно завершить работу — он немедленно
убивает процесс. В качестве приемника метод принимает указатель
на структуру os.Process, полученную при запуске процесса
через os.StartProcess или os.FindProcess.
Метод возвращает ошибку, если завершить процесс не удалось.
Синтаксис
err := p.Kill()
Пример
Давайте запустим внешнюю программу, которая выполняется 5 секунд, и завершим ее принудительно через 1 секунду:
package 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")
}
Результат выполнения кода:
"Process killed successfully"
В этом примере программа sleep 5 была запущена,
но через секунду была принудительно завершена методом
Kill, не дожидаясь естественного окончания.
Пример
Давайте попробуем завершить уже завершенный процесс и обработаем ошибку:
package 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")
}
Результат выполнения кода:
"Error: os: process already finished"
Здесь мы видим, что попытка завершить уже завершившийся процесс приводит к ошибке, которую нужно корректно обрабатывать в программе.
Пример
Давайте используем метод Kill вместе с Wait
для дожидания завершения процесса после отправки сигнала:
package 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")
}
Результат выполнения кода:
"Wait error: signal: killed"
"Process finished"
В этом примере метод Wait возвращает ошибку
сигнала killed, что подтверждает факт
принудительного завершения процесса.
Смотрите также
-
метод
os.Process.Signal,
который отправляет произвольный сигнал процессу -
метод
os.Process.Wait,
который ожидает завершения процесса -
функцию
os.FindProcess,
которая находит процесс по PID -
функцию
os.Process.Release,
которая освобождает ресурсы процесса