我想在一台 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
当我从我的用户帐户注销时也会终止。
我的发现
- 作为最简单的解决方法,我混合了禁止和否认(从这里)。
- 我猜测包括在内的命令
tee
是由于SIGPIPE
关闭终端而终止的(从这里)因此我使用重定向到日志文件或/dev/null
(从这里) 这两个程序也都是通过关闭终端来终止的。 - 我也检查过了
systemd-run
。但是它也通过关闭终端而终止。 为了查看程序是否安装了它自己的处理程序,我执行了以下命令:
nohup mpirun -np 100 icoFoam -parallel > log & grep Sig /proc/$!/status
返回
SigIgn: 0000000000000000
因此,我猜测是这样的,ie
mpirun
安装了它自己的处理程序,覆盖了nohup
(从这里)。- 我不知道是否可以发送自定义处理程序
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),也遇到了同样的问题。唯一有帮助的解决方案是这个帖子:
- 使用从控制台启动窗口管理器
screen
并按 Enter。 在屏幕控制台中,您可以根据需要输入命令,例如
nohup mpirun -np 100 icoFoam -parallel > log &
按下CtrlA和CtrlD将终端“分离”至创建的“屏幕”。
- 现在您应该能够关闭终端窗口而不终止
mpi
进程。 - 为了返回到屏幕,请打开一个新终端并输入
screen -DR
。它应该打开最后一个屏幕。 exit
如果要退出该屏幕,请在该屏幕上输入。
注释:如果您创建了多个屏幕,screen -DR
则显示包含所有屏幕会话的列表。键入screen -r [session number]
以转到屏幕或screen -X -S 63896 quit
退出屏幕。这是一个有点笨拙的解决方法,但我希望它有所帮助,希望这个错误(或功能?)在未来版本中得到解决。
欲了解更多信息,请参阅man screen
。