如何从访问相同代码的 shell 脚本内部终止正在运行的 fortran 代码?

如何从访问相同代码的 shell 脚本内部终止正在运行的 fortran 代码?

我必须使用具有“菜单样式”界面的 FORTRAN 代码。我在终端上输入命令来访问代码,从而打开主菜单。从那时起,我输入一个数字并输入它来选择一个选项,该选项可以打开子菜单或执行命令。要退出,我必须导航回主菜单并输入“0”以结束代码并“返回终端”。例如,在终端上我输入:

code_command %打开 FORTRAN 代码主菜单

1→ 我从主菜单中选择选项 1,这将打开一个子菜单;

2→ 从子菜单 1 中,我通过输入选项 2 来选择另一个子菜单;

7→ 从这个第二个子菜单中,我选择执行所需任务的第 7 个选项。

0→ 我从第二个子菜单返回

0→ 我从第一个子菜单返回(到主菜单)。

0→ 我留下代码并返回终端

因此,我编写了一个为执行某项任务必须输入的命令列表,并将此文本保存为“script.sh”,为了让代码执行此列表,我输入:

code_command < script.sh

最后,除了最后一行之外,它完美地执行了所有行,当它崩溃时,我必须打开其他终端并输入:

pkill code_command

Ctrl+Z在崩溃的终端窗口内。

有没有办法 在 中编写一个Ctrl+来在崩溃之前终止正在运行的代码?Zscript.sh

答案1

我假设您正在使用 bash,尽管这也适用于 sh 和 csh。

首先:将 ulimit 核心设置为非零(这样您就可以创建核心转储)。man bash然后搜索 ulimit。。bashulimit -c <max size of core dump>默认为无核心转储,每次打开新窗口或启动新会话时都必须重新输入。

第二步:运行程序,在另一个窗口中kill -3 <pid>查看程序是否仍在运行并获取核心转储。查看man 7 signal“SIGQUIT”或“-3”选项。

第三。使用gdb查看导致问题的语句。您必须使用“-g”选项编译程序。gdb <fortran executable name> core. gdb可用于交互式调试。(这远远超出了您提出的问题)。

从你在问题中提到的内容来看,你没有正确处理“<input”或 stdin 的 EOF,也没有退出命令循环并停止。或者你处于无限循环中或在子菜单中等待输入。finally 会在进程kill -3 <pid>挂起的位置终止进程。

Ctrl+正在暂停正在运行的 fortran 程序。可执行文件在挂起时仍在运行。如果您输入foregroundz命令,fortran 程序将从+之前的位置继续运行。fgCtrlz

相关内容