父进程终止时脚本死亡

时间:2018-08-17 15:23:32

标签: linux bash shell .net-core asp.net-core-2.0

我有一个在 Debian 9 上运行的 .NET Core 服务,我们称之为 MyService 。在某个时候,此服务正在将update.shProcess.Start()结合使用bash脚本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也被终止,从而导致不一致的软件包必须手动修复。

我想要的是当{em> MyService 终止时update.sh没有终止。

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

  • 我尝试从update2.shsetsid开始nohup,但是我总是得到相同的结果。
  • 我尝试用update2.sh在新的bash shell中执行/bin/bash /c "update2.sh"脚本,结果相同。

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

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

.NET Core 代码以在 MyService 二进制文件内启动Shell脚本:

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");
}

update.sh:

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

update2.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返回代码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

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

  • nohup
  • setsid
  • 取消
  • 屏幕
  • tmux
  • 取消共享

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

0 个答案:

没有答案