过去6个月左右,我一直在Ubuntu 14.04上使用简单的游戏服务器管理应用程序。最近的服务器更新后&重启应用程序将在尝试启动子进程时挂起。经过一些调试后,似乎无论何时我尝试使用其他用户的凭据启动子进程(我以root身份运行),任何命令都会挂起。
这是一个简单的应用程序来演示导致挂起的原因:
package main
import (
"os/exec"
"syscall"
"fmt"
)
func main() {
proc := exec.Command("ls")
proc.SysProcAttr = &syscall.SysProcAttr{}
proc.SysProcAttr.Credential = &syscall.Credential{Uid: 1022, Gid: 1023}
err := proc.Run()
if err != nil {
fmt.Printf("err: %v", err)
}
}
通过删除syscall.Credential部分,应用程序将运行而不会出现任何问题。
我的问题是:是否存在导致此行为的某些平台/更新特定原因?这不再是以另一个用户身份运行子进程的正确方法吗?
编辑: 这是最后5行strace -f
[pid 3994] futex(0xc21000a888, FUTEX_WAKE, 1 <unfinished ...>
[pid 3995] <... futex resumed> ) = 0
[pid 3994] <... futex resumed> ) = 1
[pid 3995] futex(0xc21000a888, FUTEX_WAIT, 0, NULL <unfinished ...>
[pid 3994] select(0, NULL, NULL, NULL, {0, 20}) = 0 (Timeout)
[pid 3994] futex(0x7f615c51a4f8, FUTEX_WAIT, 0, NULL
显然,如果我正确解释这一点,它会在futex_wait上阻止。
答案 0 :(得分:1)
您应该使用strace执行您的应用程序。所以strace myapp
并查看它锁定的位置。可能是你在应用程序执行之前还有其他东西正在分叉,导致它挂起。