这是存在于 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 }
Leave a Reply