首页 > 解决方案 > 父进程终止时脚本死亡

问题描述

我有一个在Debian 9上运行的.NET Core服务,我们称之为MyService。在某些时候,该服务正在运行一个使用with的 bash 脚本。update.shProcess.Start()ShellExecute=true

正如@omajid 指出的那样,UseShellExecute在 Linux 上并没有按照人们的想法去做。#24704

我使用UseShellExecute=false和运行得到了相同的结果/bin/bash -c "/opt/myservice/update.sh"

该脚本基本上运行:

$ apt-get update && apt-get upgrade

在包升级过程中,MyService进程被终止:更新脚本也被终止apt-get upgrade并被杀死,留下不一致的包,必须手动修复。

我想要的是在MyServiceupdate.sh终止时不会终止。

我尝试分成update.sh两部分,第一部分以不同的方式运行第二部分

问题是:如何运行从二进制文件启动并完全脱离二进制进程的脚本,以便在脚本继续运行时杀死二进制文件?

这是我的环境。MyService是作为服务运行的二进制文件。update.sh由 MyService 启动。

在MyService二进制文件中启动 shell 脚本的.NET Core代码:

var process = new Process();
process.EnableRaisingEvents = true; // to avoid [defunct] sh processes
process.StartInfo.FileName = "/opt/myservice/update.sh";
process.StartInfo.Arguments = "";
process.StartInfo.UseShellExecute = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit(10000);

if (process.HasExited) {
  Console.WriteLine("Exit code: " + process.ExitCode);
}
else {
  Console.WriteLine("Child process still running after 10 seconds");
}

更新.sh:

nohup /opt/myservice/update2.sh > /opt/myservice/update.log &
systemctl stop MyService

更新2.sh:

apt-get update >> /opt/myservice/update.log
apt-get -y install --only-upgrade myservice-1.0 >> /opt/myservice/update.log

update2.sh永远不会执行,因为它在 MyService 被终止时终止update.sh

update.sh返回 code 143,似乎已经被杀死了。

2018-08-16 14:46:14.5215|Running update script: /opt/myservice/update.sh
2018-08-16 14:46:14.5883|Update script /opt/myservice/update.sh returned: 143

我尝试了以下方法,感谢您的建议:

每种方法都有相同的结果,即终止所有衍生的进程。我怀疑这是.NET Core的“功能”。

标签: linuxbashshell.net-coreasp.net-core-2.0

解决方案


推荐阅读