我有一个在 Debian 9 上运行的 .NET Core 服务,我们称之为 MyService 。在某个时候,此服务正在将update.sh
与Process.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.sh
和setsid
开始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
我尝试了以下方法,感谢您的建议:
每种方法都具有相同的结果,即终止所有生成的进程。 我怀疑这是 .NET Core “功能”。