Situation:

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

Question:

当进程在后台运行时:how can I get it's 100 using Go?

I tried the following:

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()

这会立即返回,并让ssh在后台运行.但是它的pid不是正在运行的ssh进程中的pid.此外,它是父ssh进程的pid,在它Forking 和为自己设置背景之前.

推荐答案

你不需要任何特别的东西,只是不要告诉ssh自己做后台,也不要为此付出代价.例子:

$ cat script.sh
#!/bin/sh
sleep 1
echo "I'm the script with pid $$"
for i in 1 2 3; do
        sleep 1
        echo "Still running $$"
done
$ cat proc.go
package main

import (
       "log"
       "os"
       "os/exec"
)

func main() {
     cmd := exec.Command("./script.sh")
     cmd.Stdout = os.Stdout
     err := cmd.Start()
     if err != nil {
        log.Fatal(err)
     }
     log.Printf("Just ran subprocess %d, exiting\n", cmd.Process.Pid)
}
$ go run proc.go
2016/09/15 17:01:03 Just ran subprocess 3794, exiting
$ I'm the script with pid 3794
Still running 3794
Still running 3794
Still running 3794

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

读取JSON数据并在网页上显示

Golang测试容器,无法使网络正常工作

Golang中的泛型 struct /接口列表

Go 中带有回调的 MiniDumpWriteDump

如何为ANTLR4目标Go调试监听器

在本地 go 应用程序上获取秘密的正确策略

在密钥不存在时处理 PATCH 部分更新

如何将整数哈希细分为范围

如何处理 Go 的 firebase admin sdk 错误?

拆分文本并按空格获取字符串数组,如果文本长度超过 500,则获取字符串数组

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

CORS grpc 网关 GoLang

为什么 Go 被认为是部分抢占式的?

在 Raspberry Pi4 上下载 Go Mod

有没有办法在 golang 中定义可索引类型?

正确编码 JWT

如何在 Go 中使用 Pact 返回错误请求(400、500)?

gob 解码器仅返回数组中的第一个元素

Go 泛型是否与 LINQ to Objects 等效?