运行 一个进程搞砸了 shell
Running a process messes up shell
在我 运行 我的应用程序之前,我需要 运行 一个名为 osqueryi
的进程,并在关闭时终止该进程。 (这是一种可以查询的守护进程。我需要它 运行ning 才能让我的应用程序运行)。
func bootOsqueryi(strcmd string) {
cwd, err := os.Getwd()
if err != nil {
panic(err)
}
pa := os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Dir: cwd,
}
path, err := exec.LookPath(strcmd)
if err != nil {
handleError(err)
return
}
osqueryi, err := os.StartProcess(path, []string{strcmd}, &pa)
if err != nil {
handleError(err)
return
}
osqueryi.Wait()
}
我从眼镜蛇 PersistentPreRun
钩子中这样称呼它:go bootOsqueryi("osqueryi")
.
在 PersistentPostRun
挂钩中,我将其关闭:
func shutdown() {
if osqueryi != nil {
osqueryi.Kill()
}
}
Osqueryi
就像一个交互式 shell。它需要传递 os.Stdin
,因为显然它使用 isatty
。如果我不这样做,它就不会 运行。所以我需要开始这个过程,因为我需要查询它,但我不需要向它写入任何输入,因为我的想法是使用 go 模块 osquery-go
从我的应用程序发出查询...
我需要在 go
例程中调用它,否则我无法将日志输出写入屏幕...
无论如何,它还挺管用的。但是,当应用程序终止时,我的终端就乱七八糟了:我的提示行不见了(看不到我输入的内容)。我猜,因为我正在为其分配 STDIN 但我从不写入它,同时通过 fmt.Println()
.
将输出写入 STDOUT
有没有办法让它工作?
你标记了 osquery,所以...也许作为替代方案,不要 运行 osqueryi
那样,它不应该那样使用。
一般建议使用 osqueryd
和您喜欢的配置。或者,如果您真的想单次调用 osqueryi
,您可以通过命令行查询来调用它,在 json:
中输出
osqueryi --json "select 1"
[
{"1":"1"}
]
osqueryi
与 osqueryd
并不相同。
在我 运行 我的应用程序之前,我需要 运行 一个名为 osqueryi
的进程,并在关闭时终止该进程。 (这是一种可以查询的守护进程。我需要它 运行ning 才能让我的应用程序运行)。
func bootOsqueryi(strcmd string) {
cwd, err := os.Getwd()
if err != nil {
panic(err)
}
pa := os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Dir: cwd,
}
path, err := exec.LookPath(strcmd)
if err != nil {
handleError(err)
return
}
osqueryi, err := os.StartProcess(path, []string{strcmd}, &pa)
if err != nil {
handleError(err)
return
}
osqueryi.Wait()
}
我从眼镜蛇 PersistentPreRun
钩子中这样称呼它:go bootOsqueryi("osqueryi")
.
在 PersistentPostRun
挂钩中,我将其关闭:
func shutdown() {
if osqueryi != nil {
osqueryi.Kill()
}
}
Osqueryi
就像一个交互式 shell。它需要传递 os.Stdin
,因为显然它使用 isatty
。如果我不这样做,它就不会 运行。所以我需要开始这个过程,因为我需要查询它,但我不需要向它写入任何输入,因为我的想法是使用 go 模块 osquery-go
从我的应用程序发出查询...
我需要在 go
例程中调用它,否则我无法将日志输出写入屏幕...
无论如何,它还挺管用的。但是,当应用程序终止时,我的终端就乱七八糟了:我的提示行不见了(看不到我输入的内容)。我猜,因为我正在为其分配 STDIN 但我从不写入它,同时通过 fmt.Println()
.
有没有办法让它工作?
你标记了 osquery,所以...也许作为替代方案,不要 运行 osqueryi
那样,它不应该那样使用。
一般建议使用 osqueryd
和您喜欢的配置。或者,如果您真的想单次调用 osqueryi
,您可以通过命令行查询来调用它,在 json:
osqueryi --json "select 1"
[
{"1":"1"}
]
osqueryi
与 osqueryd
并不相同。