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

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

從systemd啟動主進程時無法分離子進程

從systemd啟動主進程時無法分離子進程

Go
慕標琳琳 2021-11-01 16:41:09
我想生成長時間運行的子進程,這些子進程在主進程重新啟動/死亡時仍然存在。從終端運行時,這可以正常工作:$ cat exectest.gopackage mainimport (        "log"        "os"        "os/exec"        "syscall"        "time")func main() {        if len(os.Args) == 2 && os.Args[1] == "child" {                for {                           time.Sleep(time.Second)                }        } else {                cmd := exec.Command(os.Args[0], "child")                cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}                log.Printf("child exited: %v", cmd.Run())        }}$ go build$ ./exectest^Z[1]+  Stopped                 ./exectest$ bg[1]+ ./exectest &$ ps -ef | grep exectest | grep -v grep | grep -v vimsnowm     7914  5650  0 23:44 pts/7    00:00:00 ./exectestsnowm     7916  7914  0 23:44 ?        00:00:00 ./exectest child$ kill -INT 7914 # kill parent process[1]+  Exit 2                  ./exectest$ ps -ef | grep exectest | grep -v grep | grep -v vimsnowm     7916     1  0 23:44 ?        00:00:00 ./exectest child請注意,在父進程被殺死后,子進程仍然活著。但是,如果我像這樣從 systemd 啟動主進程......[snowm@localhost exectest]$ cat /etc/systemd/system/exectest.service [Unit]Description=ExecTest[Service]                        Type=simpleExecStart=/home/snowm/src/exectest/exectestUser=snowm[Install]WantedBy=multi-user.target$ sudo systemctl enable exectestln -s '/etc/systemd/system/exectest.service' '/etc/systemd/system/multi-user.target.wants/exectest.service'$ sudo systemctl start exectest...然后當我殺死主進程時,孩子也死了:$ ps -ef | grep exectest | grep -v grep | grep -v vimsnowm     8132     1  0 23:55 ?        00:00:00 /home/snowm/src/exectest/exectestsnowm     8134  8132  0 23:55 ?        00:00:00 /home/snowm/src/exectest/exectest child$ kill -INT 8132$ ps -ef | grep exectest | grep -v grep | grep -v vim$怎樣才能讓孩子活下來?在 CentOS Linux release 7.1.1503 (Core) 下運行 go version go1.4.2 linux/amd64。
查看完整描述

3 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

解決方法是添加

KillMode=process

到服務區。默認值是control-group這意味著 systemd 清理任何子進程。

來自man systemd.kill

KillMode= 指定如何終止該單元的進程。控制組、過程、混合、無之一。

如果設置為 control-group,則在 unit stop 時將殺死本單元 control group 中的所有剩余進程(對于服務:執行 stop 命令后,如 ExecStop= 配置的那樣)。如果設置為 process,則只會殺死主進程本身。如果設置為混合,則 SIGTERM 信號(見下文)被發送到主進程,而隨后的 SIGKILL 信號(見下文)被發送到單元控制組的所有剩余進程。如果設置為 none,則不會殺死任何進程。在這種情況下,單元停止時只會執行停止命令,否則不會殺死任何進程。停止后還活著的進程留在他們的控制組中,控制組在停止后繼續存在,除非它是空的。


查看完整回答
反對 回復 2021-11-01
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

如果KillMode由于某種原因你不能(像我一樣)改變服務的,你可以試試這個at命令(見man)。


您可以安排您的命令提前 1 分鐘運行??匆粋€例子:


# this will remove all .tmp files from "/path/" in 1 minute ahead (this task will run once)

echo rm /path/*.tmp | at now + 1 minute


查看完整回答
反對 回復 2021-11-01
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

據我所知,解決這個問題的唯一可行方法是使用不同的 cgroup 啟動子進程。您可以使用 systemd-run 命令和 --slice 參數來做到這一點。

systemd-run --user --scope --slice=app-firefox firefox

更改 KillMode 還意味著如果您的主進程崩潰,并且任何子進程仍在運行,systemd 將不會重新啟動它。


查看完整回答
反對 回復 2021-11-01
  • 3 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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