亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在單獨的進程中啟動應用程序“分離”。啟動的進程必須在它自己的會話中運行并且像一個守護進程一樣運行

如何在單獨的進程中啟動應用程序“分離”。啟動的進程必須在它自己的會話中運行并且像一個守護進程一樣運行

Go
慕田峪4524236 2022-07-18 17:11:30
有誰知道如何在 golang (Go) 中運行分離命令?任務是:我有 app1 和 app2,app2 做大而長的工作,大約。2 小時。但是 app1 是默認應用程序,它可以在幾分鐘內完成工作,每天調用 1-2 次。實際上,我需要運行 app1,而不是在 app1 gorutine 中運行 app2,app1 將完成其工作并關閉,但 app2 必須仍然工作,直到其任務列表結束。如果運行 2-3 個 app2 實例,這可能是正常情況。我需要smth。像這樣,我在 bash 中做什么:$ ./my-app &...或在 Qt 中:QProcess prc;prc.setArguments(args);prc.setProgram(app2);prc.setWorkingDirectory(dir);prc.startDetached();Qt 文檔:bool QProcess::startDetached(qint64 *pid = nullptr)在新進程中使用參數啟動程序,并從中分離...如果調用進程退出,分離的進程將繼續運行而不受影響。啟動的進程將在其自己的會話中運行,并像一個守護進程一樣運行。如果函數成功,則 *pid 設置為已啟動進程的進程標識符。請注意,子進程可能會退出,PID 可能會變為無效,恕不另行通知。此外,子進程退出后,同一個PID可能會被完全不同的進程回收使用。所以,我在 Go 中這樣做:    cmd := exec.Command("./app2", "&")    _ = cmd.Run()...但它沒有幫助,'app2' 仍然沒有分離。如果我從運行“app2”的地方殺死主app1,那么“app2”也將被關閉。我也嘗試過這種方式:(在app1中)    var attr = os.ProcAttr{        Dir: ".",        Env: os.Environ(),        Files: []*os.File{            os.Stdin,            os.Stdout,            os.Stderr,        },    }    process, err := os.StartProcess(server, []string{"/usr/local/app2"}, &attr)    if err == nil {        err = process.Release()    }    if err != nil {        log.Println(err)    }并且可以告訴,它也不起作用?,F在我只有一個解決方案:使用 ListenAndServe 將 app2 設為服務器,然后在 app1 中運行 app2,不管如何,但在 gorutine 中:go func() {    cmd := exec.Command("/usr/local/app2")    _ = cmd.Run()}()并在 bash 中將 app1 作為獨立進程運行:./app1 &在這種情況下,app1 將運行 app2,完成所有工作并關閉,但 app2 將完成所有長期工作。實際上,我想在 golang(Go 語言)中做與 Qt 中的 QProcess::startDetached 相同的操作(用于擴展 C++ 語言的跨平臺應用程序開發框架)PS。Golang(或 Go,對于在使用 Golang 單詞的情況下心臟病發作的語法納粹分子):順便說一句,“不過,許多人使用 golang 名稱,它作為標簽很方便” https://golang.org/doc /常見問題解答#go_or_golang
查看完整描述

2 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

在 linux go 版本 1.15.2 上,我運行下面的代碼,它會產生一個不會隨 main 死的新進程。


package main


import (

    "log"

    "os"

    "os/exec"

)


func main() {

    cmd := exec.Command("go", "run", "./d")

    cmd.Stdin = os.Stdin

    cmd.Stdout = os.Stdout

    cmd.Stderr = os.Stderr

    log.Printf("Running command and waiting for it to finish...")

    err := cmd.Start()

    if err != nil {

        log.Fatal("cmd.Start failed: ", err)

    }

    err = cmd.Process.Release()

    if err != nil {

        log.Fatal("cmd.Process.Release failed: ", err)

    }

}

./d/main.go在哪里


package main


import (

    "fmt"

    "time"

)


func main() {

    go func() {

        for {

            fmt.Println("hop")

            <-time.After(time.Second)

        }

    }()

    <-make(chan bool)

}


查看完整回答
反對 回復 2022-07-18
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

.Process.Release()我有一個場景,當父進程退出后,即使使用 , 生成的進程也會被殺死。


我根據這篇文章找到了一個解決方案:https ://www.tecmint.com/run-linux-command-process-in-background-detach-process/


通過使用nohupLinux 命令,我能夠創建一個完全獨立于任何其他進程的進程。(它會直接systemd在進程樹下運行)


這是一個示例代碼:


package main


import (

  "fmt"

  "os/exec"

)


func main(){

  exePath="_path_to_the_background_process"

  cmd := exec.Command("/usr/bin/nohup", exePath, "parameter1", "parameter2")

  if err := cmd.Start(); err != nil {

    fmt.Println("There was a problem running ", exePath, ":", err)

  } else {

    cmd.Process.Release()

    fmt.Println(exePath, " has been started.")

  }

}

注意:這/usr/bin/nohup是我系統中的路徑nohup??梢酝ㄟ^運行找到whereis nohup


查看完整回答
反對 回復 2022-07-18
  • 2 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號