我想在 ubuntu 台式计算机上开始一个大型模拟。我可以物理(非远程)访问这台 PC。此模拟可能需要数周时间。启动进程的命令是:
mpirun -np 100 icoFoam -parallel | tee log
icoFoam
可执行文件在哪里,-parallel
需要作为它的选项。
此命令在终端中打印数据。有时终端关闭或操作系统在长时间模拟期间随机注销,因此,进程终止。我试图通过几个替代命令来解决这个问题:
nohup mpirun -np 100 icoFoam -parallel > log &
nohup mpirun -np 100 icoFoam -parallel > log & disown &
nohup mpirun -np 100 icoFoam -parallel | tee log & disown &
nohup mpirun -np 100 icoFoam -parallel | tee log & disown & > /dev/null 2>& 1 & nohup mpirun -np 100 icoFoam -parallel > /dev/null 2>& 1 &
systemd-run --scope --user mpirun -np 100 icoFoam -parallel | tee log &
systemd-run --scope --user mpirun -np 100 icoFoam -parallel | tee log & disown &
systemd-run --scope --user nohup mpirun -np 100 icoFoam -parallel | tee log & disown &
tmux
结果
除了 form tmux
,使用这些命令中的任何一个,当我关闭终端时,进程都会终止。
tmux
当我从我的用户帐户注销时也会终止。
我的发现
- 作为最简单的解决方法,我混合了nohup和disown(从这里)。
- 我猜想包括 , 在内的命令由于关闭终端(从这里)而
tee
被终止。因此,我使用重定向到日志文件或(从这里),这两者也都通过关闭终端而终止。SIGPIPE
/dev/null
- 我也检查了
systemd-run
。但它也可以通过关闭终端来终止。 为了查看程序是否安装了自己的处理程序,我执行了这个:
nohup mpirun -np 100 icoFoam -parallel > log & grep Sig /proc/$!/status
哪个返回
SigIgn: 0000000000000000
因此,我猜是这种情况,即
mpirun
安装了自己的处理程序来覆盖nohup
(从这里)的保护。- 我不知道是否可以发送自定义处理程序以
mpirun
不覆盖nohup
.
我的问题
我想执行以下命令,以便只要终端未关闭,它就会在终端中打印输出,并且不会通过关闭终端或从用户帐户注销来终止该过程。
mpirun -np 100 icoFoam -parallel
操作系统:Ubuntu 18.04
可执行文件:OpenFOAM
mpirun(Open MPI):2.1.1
更新
通过注销,我的意思是按注销按钮(图像),而不是锁定屏幕(super+L)
先感谢您。
问题是您是从桌面环境中开始工作的,因此这些工作是该桌面的子项。当桌面结束时,无论出于何种原因,所有子项也会自动结束。'nohup' 不会保存它们 - 注销会删除输出应该打印到的显示,这也会导致致命错误。
考虑在tty而不是终端窗口中运行 tmux 。然后,无论桌面在做什么,该过程都可以永远运行。
我在这里有相同的配置(Ubuntu 18.04、OpenFoam v7、Open MPI 2.1.1),我也面临同样的问题。唯一有帮助的解决方案是本文中描述的步骤:
screen
然后按 Enter。在屏幕控制台中,您可以根据需要输入命令,pe
按CtrlA和CtrlD将终端“分离”到创建的“屏幕”。
mpi
进程的情况下关闭终端窗口。screen -DR
. 它应该打开最后一个屏幕。exit
如果要退出屏幕,请在屏幕中键入。注释:如果您创建了多个屏幕,则
screen -DR
显示包含所有屏幕会话的列表。键入screen -r [session number]
以转到屏幕或screen -X -S 63896 quit
退出屏幕。这是一个有点笨拙的解决方法,但我希望能有所帮助,期待这个错误(或功能?)在未来的版本中得到解决。有关详细信息,请参阅
man screen
。第二种方法是使用在新会话
setsid
中运行。mpirun
优点是当终端关闭(挂断信号SIGHUP
)时,此会话不会被终止,正如这里一般建议的,更具体的建议这里。语法很简单:setsid mpirun -np 100 icoFoam -parallel > log &
为了
mpirun
出于任何原因手动终止,请使用 终止其中一个icofoam
进程htop
,然后按并按F9发送。所有其他进程和进程也应该被杀死。或者,按此处建议的方式键入。SIGKILL
9icofoam
mpirun
killall mpirun