3 回答

TA貢獻1725條經驗 獲得超8個贊
解決方法是添加
KillMode=process
到服務區。默認值是control-group
這意味著 systemd 清理任何子進程。
KillMode= 指定如何終止該單元的進程。控制組、過程、混合、無之一。
如果設置為 control-group,則在 unit stop 時將殺死本單元 control group 中的所有剩余進程(對于服務:執行 stop 命令后,如 ExecStop= 配置的那樣)。如果設置為 process,則只會殺死主進程本身。如果設置為混合,則 SIGTERM 信號(見下文)被發送到主進程,而隨后的 SIGKILL 信號(見下文)被發送到單元控制組的所有剩余進程。如果設置為 none,則不會殺死任何進程。在這種情況下,單元停止時只會執行停止命令,否則不會殺死任何進程。停止后還活著的進程留在他們的控制組中,控制組在停止后繼續存在,除非它是空的。

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

TA貢獻1784條經驗 獲得超8個贊
據我所知,解決這個問題的唯一可行方法是使用不同的 cgroup 啟動子進程。您可以使用 systemd-run 命令和 --slice 參數來做到這一點。
systemd-run --user --scope --slice=app-firefox firefox
更改 KillMode 還意味著如果您的主進程崩潰,并且任何子進程仍在運行,systemd 將不會重新啟動它。
- 3 回答
- 0 關注
- 186 瀏覽
添加回答
舉報