英文:
Run an executable file detached from originator
问题
我正在尝试弄清楚如何使用ForkExec从Go中运行可执行文件。到目前为止,我尝试了以下代码:
var sysProcAttr = syscall.SysProcAttr{}
sysProcAttr.Setsid = true
sysProcAttr.Foreground = false
var procAttr = syscall.ProcAttr{
Dir: "/",
Env: nil,
Sys: &sysProcAttr,
}
processID, err = syscall.ForkExec("/home/ubuntu/.dotnet/dotnet", []string{"/home/ubuntu/my-executable-net-dll-file"}, &procAttr)
return processID, err
这会创建一个进程,但当我关闭Go应用程序时,这些进程也会关闭。问题是 - 如何将进程与应用程序分离?似乎Setsid不起作用,剩下的选项只能使用nohup或"bash -c",但我担心结果会相同。
英文:
I'm trying to figure out how to run an executable file from Go using ForkExec. Having tried this so far:
var sysProcAttr = syscall.SysProcAttr{}
sysProcAttr.Setsid = true
sysProcAttr.Foreground = false
var procAttr = syscall.ProcAttr{
Dir: "/",
Env: nil,
Sys: &sysProcAttr,
}
processID, err = syscall.ForkExec("/home/ubuntu/.dotnet/dotnet", []string{"/home/ubuntu/my-executable-net-dll-file"}, &procAttr)
return processID, err
This creates a process, but when I close the Go application these processes close as well. The question is - how do I detach the process from it? It appears that Setsid doesn't work, the only options left are to use nohup or "bash -c", but I fear the results will be the same.
答案1
得分: 1
当我关闭Go应用程序时,这些进程也会关闭。
os/exec
的Command
似乎没有相同的行为,至少不是固有的:
% pid=$(go run t.go); while ps $pid; do sleep 1; done
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
[2021/11/08 08:23:45 CST ] ~
package main
import (
"os/exec"
"fmt"
)
func main() {
c := exec.Command("bash", "-c", "sleep 3; echo slept 3; sleep 3; echo slept 3 more")
if err := c.Start(); err != nil {
panic(err)
}
fmt.Println(c.Process.Pid)
}
这可能取决于生成的进程行为。请参阅https://unix.stackexchange.com/questions/158727/is-there-any-unix-variant-on-which-a-child-process-dies-with-its-parent
英文:
> when I close the Go application these processes close as well.
os/exec
's Command
doesn't seem to have the same behavior, at least not inherently:
% pid=$(go run t.go); while ps $pid; do sleep 1; done
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
33132 s006 S 0:00.00 bash -c sleep 3; echo slept 3; sleep 3; echo slept 3 more
PID TT STAT TIME COMMAND
[2021/11/08 08:23:45 CST ] ~
package main
import (
"os/exec"
"fmt"
)
func main() {
c := exec.Command("bash", "-c", "sleep 3; echo slept 3; sleep 3; echo slept 3 more")
if err := c.Start(); err != nil {
panic(err)
}
fmt.Println(c.Process.Pid)
}
It could depend on spawned process behavior. See https://unix.stackexchange.com/questions/158727/is-there-any-unix-variant-on-which-a-child-process-dies-with-its-parent
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论