nohup 和 mpirun 有冲突吗?

nohup 和 mpirun 有冲突吗?

我想在一台 Ubuntu 台式电脑上启动一个大型模拟。我可以物理(而非远程)访问这台电脑。此模拟可能需要几周时间。启动该过程的命令是:

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

结果
除形式外tmux,使用这些命令中的任何一个,当我关闭终端时,该过程都会终止。
tmux当我从我的用户帐户注销时也会终止。

我的发现

  1. 作为最简单的解决方法,我混合了禁止否认从这里)。
  2. 我猜测包括在内的命令tee是由于SIGPIPE关闭终端而终止的(从这里)因此我使用重定向到日志文件或/dev/null从这里) 这两个程序也都是通过关闭终端来终止的。
  3. 我也检查过了systemd-run。但是它也通过关闭终端而终止。
  4. 为了查看程序是否安装了它自己的处理程序,我执行了以下命令:

    nohup mpirun -np 100 icoFoam -parallel > log  &
    grep Sig /proc/$!/status
    

    返回

    SigIgn: 0000000000000000
    

    因此,我猜测是这样的,iempirun安装了它自己的处理程序,覆盖了nohup从这里)。

  5. 我不知道是否可以发送自定义处理程序mpirun以避免覆盖nohup

我的问题
我想执行以下命令,只要终端未关闭,它就会在终端中打印输出,并且不会通过关闭终端或从用户帐户注销而终止该过程。

mpirun -np 100 icoFoam -parallel

操作系统:Ubuntu 18.04
可执行文件:OpenFOAM
mpirun (Open MPI):2.1.1

更新
退出是指按退出按钮(图片),而不是锁屏(super+L) 在此处输入图片描述

先感谢您。

答案1

问题是你正在开始这份工作在桌面环境中,因此作业是该桌面的子项。当桌面结束时,无论出于何种原因,所有子项也会自动结束。'nohup' 不会保存它们 - logout 会删除输出应打印到的显示,这也会导致致命错误。

考虑在终端代替终端窗口。那么无论桌面正在做什么,该进程都可以永远运行。

答案2

我这里有相同的配置(Ubuntu 18.04、OpenFoam v7、Open MPI 2.1.1),也遇到了同样的问题。唯一有帮助的解决方案是这个帖子

  1. 使用从控制台启动窗口管理器screen并按 Enter。
  2. 在屏幕控制台中,您可以根据需要输入命令,例如

    nohup mpirun -np 100 icoFoam -parallel > log  &
    
  3. 按下CtrlACtrlD将终端“分离”至创建的“屏幕”。

  4. 现在您应该能够关闭终端窗口而不终止mpi进程。
  5. 为了返回到屏幕,请打开一个新终端并输入screen -DR。它应该打开最后一个屏幕。
  6. exit如果要退出该屏幕,请在该屏幕上输入。

注释:如果您创建了多个屏幕,screen -DR则显示包含所有屏幕会话的列表。键入screen -r [session number]以转到屏幕或screen -X -S 63896 quit退出屏幕。这是一个有点笨拙的解决方法,但我希望它有所帮助,希望这个错误(或功能?)在未来版本中得到解决。

欲了解更多信息,请参阅man screen

答案3

第二种方法是使用在新的会话中setsid运行mpirun。优点是当终端关闭时(挂断信号,SIGHUP),此会话不会被终止,正如一般建议的那样这里更具体地说这里.语法很简单:

setsid mpirun -np 100 icoFoam -parallel > log &

为了因mpirun任何原因手动终止,请使用 终止其中一个icofoam进程htopF9然后SIGKILL按 发送9。所有其他icofoam进程和mpirun进程也应被终止。或者,killall mpirun按建议输入这里

相关内容