Golang 在 POSIX 系统下使用 PID 判断进程是否存在的方法

这是存在于 golib 库中一个长达两年的 bug。之前虽然有遇到,但也不是什么十分大的问题,所以没有留意。今天再次遇到,突然有点不爽,强迫症发作。

golib 的 pid 子包设计用于帮助服务进程生成 POSIX 系统下的 PID 文件。首先程序会判断指定的 PID 文件是否存在,以及该文件中标识的进程是否存在。如果进程存在则返回 ErrProcessExists 的错误;反之,如果进程不存在,则用新的 PID 覆盖文件内容。之前的代码使用了 os.FindProcess,但是这个函数的行为,与其文档描述实际在 POSIX 系统上是存在差异的。可以参考 go-nut 上的讨论,或者 Issue 7392048

无效的方式

_, err = os.FindProcess(pid)
if err == nil {
	// process exists
	err = ProcessExists
	return
}

正确的判断:

if err = syscall.Kill(pid, 0); err == nil {
	err = ErrProcessExists
	return
}

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *