情况:
我想运行一个将自己置于后台的命令.如果它更有可能,那么我将在前台运行命令并将其自己带入后台.
题:
当进程在后台运行时:我怎样才能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过程.而且,它是pid父ssh进程之前的分叉和后台.
从一个空的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继续访问我的集群?
为了编译我的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.
在 54 核机器上,我用来os.Exec()生成数百个客户端进程,并使用大量的 goroutine 来管理它们。
有时,但并非总是,我会得到这样的信息:
\n\nruntime: failed to create new OS thread (have 1306 already; errno=11)\nruntime: may need to increase max user processes (ulimit -u)\nfatal error: newosproc\nRun Code Online (Sandbox Code Playgroud)\n\n我的 ulimit 已经相当高了:
\n\n$ ulimit -u\n1828079\nRun Code Online (Sandbox Code Playgroud)\n\n如果我将自己限制在 54 个客户之内,那绝对不会有问题。
\n\n有没有办法可以更优雅地处理这种情况?例如\xc2\xa0不会因为致命错误而崩溃,而只是做更少/延迟的工作?或者提前查询系统并预测我可以做的最大数量的事情(尽管我不想限制核心数量)?
\n\n鉴于我的 ulimit 很大,这个错误是否应该发生?grep -c goroutine致命错误后的堆栈输出仅给出 6087。每个客户端进程(其中肯定少于 2000 个)可能有一些自己的 goroutine,但没什么疯狂的。
编辑:该问题仅发生在高核机器(~60)上。保持其他一切不变,只需将内核数量更改为 30(这是 OpenStack 环境,因此仍在使用相同的底层硬件),就不会发生这些运行时错误。
\n这个 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) 我正在使用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?我的代码需要知道这一点,然后我可以要求用户提供这些东西.