Linux上的.Net Core 3.0,systemd服务启动独立进程

S.Z*_*ges 6 c# .net-core-3.0

我有一个 .Net Core 3.0 应用程序,它在我的Raspberry Pi(Raspbian)上作为 systemd 服务运行。

现在我有第二个应用程序,它将服务应用程序更新为新版本。

服务应用程序检测到有可用的新更新,并使用以下命令启动更新应用程序。

Process.Start("/bin/bash", "-c \"nohup /./test/update/bin/start-update\" >/dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)

更新应用程序停止服务应用程序,这也会杀死启动的更新应用程序。

当我从控制台运行命令时,一切正常。

有没有人有解决方案可以从用 C#/.Net Core 3.0 编写的 systemd 服务启动一个新的完整独立进程?

小智 2

我目前处于同样的情况,只是使用基于 Java 应用程序的服务(该服务启动需要重新启动服务的更新过程,从而间接终止自身)。

SystemD 的默认行为是停止(终止)与服务相同的 ControlGroup 中的所有进程。这可以使用KillMode=指令进行更改,如下所述:

指定如何终止该单元的进程。control-group、、、之一。process​​mixednone

如果设置为control-group,则该单元控制组中的所有剩余进程将在单元停止时被终止(对于服务:执行停止命令后,如 ExecStop= 配置)。如果设置为process,则仅终止主进程本身。如果设置为mixed,则 SIGTERM 信号(见下文)将发送到主进程,而后续的 SIGKILL 信号(见下文)将发送到单元控制组的所有剩余进程。如果设置为none,则不会终止任何进程。在这种情况下,单元停止时只会执行停止命令,否则不会杀死任何进程。停止后仍处于活动状态的进程将保留在其控制组中,并且控制组在停止后继续存在,除非它为空。

[...]

默认为control-group.

您可能希望从control-group(默认)切换到任一process,这只会终止您的主进程,或者none提供一个StopExec=详细说明如何停止服务的指令。

就我而言,还有一些由我的主启动脚本启动的进程,因此任一选项都会导致一些剩余进程,但对您而言,这可能是正确的选择。