小编sbs*_*sbs的帖子

golang exec后台进程并得到它的pid

情况:

我想运行一个将自己置于后台的命令.如果它更有可能,那么我将在前台运行命令并将其自己带入后台.

题:

当进程在后台运行时:我怎样才能pid使用Go?

我尝试了以下方法:

cmd := exec.Command("ssh", "-i", keyFile, "-o", "ExitOnForwardFailure yes", "-fqnNTL", fmt.Sprintf("%d:127.0.0.1:%d", port, port), fmt.Sprintf("%s@%s", serverUser, serverIP))
cmd.Start()
pid := cmd.Process.Pid
cmd.Wait()
Run Code Online (Sandbox Code Playgroud)

这会立即返回并ssh在后台运行.但这pid不是pid正在运行的ssh过程.而且,它是pidssh进程之前的分叉和后台.

pid exec go

11
推荐指数
2
解决办法
2万
查看次数

如何让kubectl登录AWS EKS集群?

从一个空的AWS账户开始,我试图关注https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html

这意味着我创建了一个VPS堆栈,然后安装了aws-iam-authenticator,awscli和kubectl,然后创建了一个具有Programmatic访问权限且直接连接了AmazonEKSAdminPolicy的IAM用户.

然后我使用该网站创建了我的EKS集群,并用于aws configure设置我的IAM用户的访问密钥和秘密.

aws eks update-kubeconfig --name wr-eks-cluster 工作得很好,但是:

kubectl get svc
error: the server doesn't have a resource type "svc"
Run Code Online (Sandbox Code Playgroud)

无论如何我继续创建我的工作节点堆栈,现在我处于一个死胡同:

kubectl apply -f aws-auth-cm.yaml
error: You must be logged in to the server (the server has asked for the client to provide credentials)
Run Code Online (Sandbox Code Playgroud)

aws-iam-authenticator token -i <my cluster name> 似乎工作正常.

我似乎缺少的是,当您创建群集时,您指定了IAM角色,但是当您创建用户时(根据指南),您附加了一个策略.我的用户应该如何访问此群集?

或者最终,如何使用kubectl继续访问我的集群?

amazon-web-services kubernetes kubectl amazon-eks

7
推荐指数
2
解决办法
5297
查看次数

你如何使-tags netgo成为go的默认值?

为了编译我的golang包以便它生成一个静态链接的可执行文件,我必须说:

go install -tags netgo
Run Code Online (Sandbox Code Playgroud)

另外我现在意识到在没有gcc的系统上,我必须:

go get -tags netgo github.com/mypackage/...
go test -tags netgo ./...
Run Code Online (Sandbox Code Playgroud)

如果你一直在打字,那就不那么好了.我设置了别名,所以我可以输入更少,但有没有"更好"或"正确"的方式将-tags netgo设置为某种默认值?理想情况下,作为我的包本身的一部分,所以一个陌生人尝试使用我的包不会错过-tags netgo.

编辑:我也想说:

go install -tags netgo -ldflags '-linkmode external -extldflags -static -w'
Run Code Online (Sandbox Code Playgroud)

IE浏览器.链接到可以静态编译的C代码.因此,在没有GCC的机器上工作对我来说不如生成静态链接的可执行文件重要.我只是想知道是否有办法做后者而不是一直说-tags netgo.

build go

5
推荐指数
1
解决办法
2579
查看次数

运行时:无法创建新的操作系统线程

在 54 核机器上,我用来os.Exec()生成数百个客户端进程,并使用大量的 goroutine 来管理它们。

\n\n

有时,但并非总是,我会得到这样的信息:

\n\n
runtime: failed to create new OS thread (have 1306 already; errno=11)\nruntime: may need to increase max user processes (ulimit -u)\nfatal error: newosproc\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 ulimit 已经相当高了:

\n\n
$ ulimit -u\n1828079\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我将自己限制在 54 个客户之内,那绝对不会有问题。

\n\n

有没有办法可以更优雅地处理这种情况?例如\xc2\xa0不会因为致命错误而崩溃,而只是做更少/延迟的工作?或者提前查询系统并预测我可以做的最大数量的事情(尽管我不想限制核心数量)?

\n\n

鉴于我的 ulimit 很大,这个错误是否应该发生?grep -c goroutine致命错误后的堆栈输出仅给出 6087。每个客户端进程(其中肯定少于 2000 个)可能有一些自己的 goroutine,但没什么疯狂的。

\n\n

编辑:该问题仅发生在高核机器(~60)上。保持其他一切不变,只需将内核数量更改为 30(这是 OpenStack 环境,因此仍在使用相同的底层硬件),就不会发生这些运行时错误。

\n

go ulimit goroutine

5
推荐指数
0
解决办法
1万
查看次数

在 go 中推迟互斥锁解锁时是否会发生数据竞争?

这个 Get 方法有问题并且容易出现理论数据竞赛吗?

type item struct {
    val   int
    mutex sync.RWMutex
}

func (i *item) Set(val int) {
    i.mutex.Lock()
    defer i.mutex.Unlock()
    i.val = val
}

func (i *item) Get() int {
    i.mutex.RLock()
    defer i.mutex.RUnlock()
    return i.val
}
Run Code Online (Sandbox Code Playgroud)

我问是因为我在-race使用以前的代码运行测试时看到了罕见的数据竞争,但找不到任何复制效果的方法。

在延迟执行 RUnlock 和我们从结构中读取和返回值之间,是否可以将 i.val 设置为不同的值?

Get() 必须是这样的吗?:

func (i *item) Get() int {
    i.mutex.RLock()
    defer i.mutex.RUnlock()
    val := i.val
    return val
}
Run Code Online (Sandbox Code Playgroud)

mutex go deferred

4
推荐指数
1
解决办法
3651
查看次数

你如何反省MooseX :: Method :: Signatures方法来看看他们采取了什么样的争论?

我正在使用MooseX :: Declare和方法,它们使用MooseX :: Method :: Signatures.假设我有一个带有'bar'方法的类'foo',我已经实现了它:

class foo {
    method bar (Str $str, Bool :$flag = 1) {
        # ....
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在想要编写一个前端界面,询问用户他们想要使用哪个类,他们想要使用哪个类,然后选择他们想要的方法.我可以做前两件事,所以让我们说用户现在选择了类foo和方法栏.

但是我如何找出方法栏将一个字符串作为第一个参数,并且一个flag => bool键值对默认为1?我的代码需要知道这一点,然后我可以要求用户提供这些东西.

perl moose method-signature

2
推荐指数
1
解决办法
81
查看次数