使用其他用户的凭据启动子进程时,应用程序挂起

时间:2016-02-01 20:57:54

标签: go

过去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上阻止。

1 个答案:

答案 0 :(得分:1)

您应该使用strace执行您的应用程序。所以strace myapp并查看它锁定的位置。可能是你在应用程序执行之前还有其他东西正在分叉,导致它挂起。