为什么 Ubuntu 16.04 执行特定的 C# 映像会在 90 秒后停止,而其他映像则 24X7 运行?

为什么 Ubuntu 16.04 执行特定的 C# 映像会在 90 秒后停止,而其他映像则 24X7 运行?

我想找到一个类似于 strace 的 Ubuntu Linux 16.04 systen 命令来找出为什么我的 C++ 程序 ServiceController.exe ,

[execle  ("/usr/lib/mono/4.5/mono-service","/usr/lib/mono/4.5/mono-service",
         "./Debug/ComputationalImageClientServer.exe", 
          0, char const* EnvironmentPtr)]

90 秒后神秘地停止运行 * 其中 * ComputationalImageClientServer.exe 和 ComputationalImageClientServer.exe 是 C#/.NET 4.5 可执行文件

In contrast, when I run /usr/lib/mono/4.5/mono-service.exe  ./Debug/ComputatationalImageVideoServer.exe" at the command prompt,

它至少连续运行 7 天 24 小时。

为什么第一个示例不能 24X7 连续运行?我如何诊断、调试和修复此错误?

open("Delaware_Client_Server.exe", O_RDONLY) = 3
pipe2([4, 5], O_CLOEXEC)                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f743e4dca10) = 3509
close(5)                                = 0
fcntl(4, F_SETFD, 0)                    = 0
fstat(4, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
read(4, "", 4096)                       = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3509, si_uid=1000, si_status=1, si_utime=0, si_stime=0} ---
close(4)                                = 0
wait4(3509, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 3509
write(1, "\n", 1)                       = 1
write(1, "Process returned 256\n", 21)  = 21

答案1

使用 GNU 调试器、gdb 或类似的东西。

答案2

将程序作为守护进程运行和使用“&”将其分叉到后台有什么区别?

指出 SIGHUP 可能是导致 ServiceController.exe 在 90 秒后停止运行的罪魁祸首。 nohup 命令 & 可以防止这种情况发生。

使用命令 & 当父进程死亡时,您的进程将被 SIGHUP 信号杀死。

不过,系统管理员可以使用一些解决方法。

在 bash 系统上,您可以使用:(trap '' HUP; 命令) &

这将打开一个子 shell,用空处理程序捕获 HUP 信号并对其进行与号/分叉。

输出可能仍会被重定向到错误的 tty。或者迷路。您可以使用 &>command.out、1>output.out 或 2>errors.out 修复该问题

在大多数系统上,您可能还可以访问 nohup 命令。 nohup 大大简化了这个过程。这是相当标准的,但我发现许多 busybox 嵌入式 ARM 发行版都缺少它。你只需写: nohup 命令 &

..你就完成了。输出被重定向 (IIRC) 到 nohup.out,但可以使用选项更改此文件名。

相关内容