linux - 父进程终止时脚本死亡
问题描述
我有一个在Debian 9上运行的.NET Core服务,我们称之为MyService。在某些时候,该服务正在运行一个使用with的 bash 脚本。update.sh
Process.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
两部分,第一部分以不同的方式运行第二部分
- 我尝试从开始,
update2.sh
但我总是得到相同的结果。setsid
nohup
- 我尝试
update2.sh
在新的 bash shell 中执行脚本/bin/bash /c "update2.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的“功能”。
解决方案
推荐阅读
- python - 使用数组索引训练网络(tensorflow)
- c# - 在两个值之间获取 n 个不同的随机数,其和等于给定数
- python - django:无法通过单击提交按钮调用 python 函数
- python - how to add add new row for each distinct ID in pandas?
- eclipse - 缺少工件 com.google.appengine:appengine-tools-sdk:jar:${appengine.sdk.version}
- python - How To Edit ManyToManyField In Django Admin list Display Page?
- roku - Use LabelList or MarkupList to render two labels for each content node?
- python - Pandas groupby find common strings
- c# - How to get ApplicationDbContext instance in AccountController for ASP .NET Core 2.0 With Individual Authentication?
- selenium - how to execute Cucumber Step defination with TestNG annotation