如果我有一个进程的PID,os.FindProcess是否足以测试现有的进程?我的意思是,如果它返回err
我可以假设它已终止(或被杀死)?
编辑:
我刚刚编写了一个包装函数kill -s 0
(旧式bash进程测试).这没有任何问题,但我仍然很高兴,如果有其他解决方案(使用go库完成)这个问题:
func checkPid(pid int) bool {
out, err := exec.Command("kill", "-s", "0", strconv.Itoa(pid)).CombinedOutput()
if err != nil {
log.Println(err)
}
if string(out) == "" {
return true // pid exist
}
return false
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*ood 30
这是传统的unix方法,用于查看进程是否处于活动状态 - 向其发送0信号(就像您使用bash示例所做的那样).
来自kill(2)
:
Run Code Online (Sandbox Code Playgroud)If sig is 0, then no signal is sent, but error checking is still per? formed; this can be used to check for the existence of a process ID or process group ID.
并翻译成Go
package main
import (
"fmt"
"log"
"os"
"strconv"
"syscall"
)
func main() {
for _, p := range os.Args[1:] {
pid, err := strconv.ParseInt(p, 10, 64)
if err != nil {
log.Fatal(err)
}
process, err := os.FindProcess(int(pid))
if err != nil {
fmt.Printf("Failed to find process: %s\n", err)
} else {
err := process.Signal(syscall.Signal(0))
fmt.Printf("process.Signal on pid %d returned: %v\n", pid, err)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当你运行它时,你得到这个,显示进程123已经死了,进程1仍然存在但不属于你,进程12606是活着的并由你拥有.
$ ./kill 1 $$ 123
process.Signal on pid 1 returned: operation not permitted
process.Signal on pid 12606 returned: <nil>
process.Signal on pid 123 returned: no such process
Run Code Online (Sandbox Code Playgroud)
您也可以只使用syscall.Kill
. 这相当于更少的代码。
killErr := syscall.Kill(pid, syscall.Signal(0))
procExists := killErr == nil
Run Code Online (Sandbox Code Playgroud)