保持matlab进程在Linux服务器后台运行

本文主要分为两部分,分别为matlab命令行启动和Linux服务器后台运行,后者可用于各种后台运行程序,如matlab、python等。

由于疫情而远程办公的缘故,笔者最近经常用到Linux服务器。利用SSH协议可很方便地通过自己的笔记本远程访问服务器,从而进行操作。有很多商业软件可满足从个人电脑的windows平台访问远程Linux服务器,笔者正在使用的是MobaXterm。这款软件集成有SSH 会话功能和X11 server,可以很方便地加载图形界面,如下图所示。

笔者使用服务器时,首先在本地电脑打开MobaXterm的一个SSH会话,连接到服务器后,就是一个终端界面。笔者常用服务器上安装的matlab进行数值计算,在终端输入matlab后,即出现matlab的窗口界面,与windows的完全一样,可正常使用。

然而这样使用matlab需要始终保持SSH会话,也即本地电脑需要一直连接服务器,不能关机也不能断网。如果因某种原因SSH连接失败,则服务器正在运行的程序也会中断,辛苦跑了许久的仿真就白费了;此外,程序运行过程中会一直占据终端,从而导致无法做别的事。

解决这一问题,可以从两个方面考虑:第一,尝试使用命令行方式运行matlab,而不打开图形化界面;第二,尝试让matlab的运行脱离SSH连接产生的终端而独立出来,当关闭与服务器的SSH连接后,服务器端仍然保持matlab的运行。

  • 1. matlab命令行方式运行

  • 1.1. 命令行运行方法

文献1中详细介绍了命令行运行matlab的方法,这里引用其关键内容,并添加笔者的经验。在命令行下执行如下语句可获得matlab的帮助文档

$ matlab -help

需要注意的命令有

                             [-display Xdisplay | -nodisplay]

                             [--noFigureWindows]

                             [-nosplash]

                             [-desktop | -nodesktop | -nojvm]

                             [-batch MATLAB_command | -r MATLAB_command]

                             [-logfile log]

-display Xdisplay  - Send X commands to X server display, Xdisplay. Linux only.
-nodisplay  - Do not display any X commands. The MATLAB desktop will not be started. However, unless -nojvm is also provided the Java virtual machine will be started.
-noFigureWindows - Disables the display of figure windows in MATLAB.
-nosplash - Do not display the splash screen during startup.
-desktop  - Allow the MATLAB desktop to be started by a process without a controlling terminal. This is usually a required command line argument when attempting to start MATLAB from a window manager menu or desktop icon.
-nodesktop  - Do not start the MATLAB desktop. Use the current terminal for commands. The Java virtual machine will be started.
-nojvm - Shut off all Java support by not starting the Java virtual machine. In particular the MATLAB desktop will not be started.
-batch MATLAB_command - Start MATLAB and execute the MATLAB command(s) with no desktop and certain interactive capabilities disabled. Terminates upon successful completion of the  command and returns exit code 0. Upon failure, MATLAB terminates with a non-zero exit. Cannot be combined with -r.
-r MATLAB_command - Start MATLAB and execute the MATLAB_command. Cannot be combined with -batch.
-logfile log  - Make a copy of any output to the command window in file log. This includes all crash reports.

在帮助文档中可以看到与图形界面相关的几个参数是:nodisplay, nosplash, nodesktop, nojvm. 它们代表的含义上表解释的很清楚。

由于Matlab的图形环境依赖JVM,如果不启动JVM,无法执行任何和图形界面相关的命令。若不执行任何X 命令,则无法执行imshow()等绘图函数。所以,我们如果需要在命令行下执行matlab程序,最好只添加:nodesktop nosplash两个参数。

标红的为matlab两种命令行运行方式,-batch的方式直接默认不打开图形界面,也没有matlab交互界面,运行完程序后退出matlab,其运行方法为:

进入需要运行的 .m 文件目录,在终端输入

$ matlab -batch -r matlabfile

其中,matlabfile为 .m 文件名,不带类型后缀 .m

-r 的方式默认打开matlab,并运行程序,会出现matlab交互界面,运行完成后不退出matlab。若不想打开图形界面,则要配合其他参数使用,其运行方法为:

$ matlab -nodesktop -nosplash -r matlabfile

matlab运行时,可带参数[-logfile log],将终端输出结果拷贝到log文件中。

若有函数参数传入,则为

$ matlab -nodesktop -nosplash -r matlabfile(parameters)

如下图所示(MAIN_SCRIPT为要运行的脚本)

更加高级的用法是,用vim打开用户目录下的 .bashrc文件,并在其中添加:

alias mrun="matlab -nodesktop -nosplash -logfile `date +%Y_%m_%d-%H_%M_%S`.log -r"

其中,logfile `date +%Y_%m_%d-%H_%M_%S`.log 将log文件输出在以程序执行时间为文件名的log文件下。r参数表示运行matlab命令。之后执行m文件只需运行:

$ mrun matlabfile

若有实现函数参数传入调用,则为:

$ mrun matlabfile(parameters)
 

  • 1.2. 添加matlab搜索路径

采用命令行方式运行matlab,就失去手动添加搜索路径的机会了。因此,如果运行的程序需要调用其他文件夹的数据和函数时,就会出现问题。文献2给出了解决的办法,即可在需要运行的matlab程序(例如matlabfile)开头添加如下语句,以自动添加路径:

addpath(genpath(pwd));

其中,addpath的作用是将参数路径添加到搜索区,genpath是为了获取参数路径及其所有子文件夹,pwd是返回当前路径,也就是matlabfile所在的路径。这里采用的是添加相对路径的方法,更具可移植性,亦可添加绝对路径,不再赘述。

注意,此时是把matlabfile的父文件夹下及其子文件夹均添加到搜索路径中了。

另外,命令行方式运行matlab时,matlab程序仍会占用终端,且关闭终端后,程序会中止。

  • 1.3. 命令行下打开matlab文件进行编辑

在matlab的运行环境下,打开文件编辑的操作为:

>>open('matlabfile.m');

其中,matlabfile.m为文件名。如此,即可像桌面模式一样,编辑文件了。

此外,无论终端当前运行环境如何,都可以直接利用MobaXterm软件自带的编辑器功能,打开文件编辑,只需右键选中即可,如图所示。

  • 2. Linux后台运行方法

matlab以命令行方式运行,仍会占用终端,并不解决问题,因此需要采用Linux后台运行方法。主要有5种方法,分别是nohup、setsid、disown、screen、"()"等,主要参见文献3、4和5。在此之前,需要明确的是,在Linux中“&”符号跟在命令后面时表示将该命令置为后台运行,不占据终端(见文献6)。例如:

$ matlab -batch MAIN_SCRIPT &

表明将matlab这一进程以命令行形式打开,并置于后台运行。此命令执行完毕后,matlab不占据终端,但终端会显示matlab的运行输出,且会受到SSH会话的影响。

此时终端输入jobs可查询正在后台运行的程序,如

笔者测试另一命令行方法 -r 并不能后台运行,原因可能跟交互式界面有关,这一点跟几个参考文献的内容相左。

命令行运行matlab,输出端口成为了当前终端,所有打印结果均输出到当前终端。如果想要把结果打印到文件而非终端,则需要在1.1节的基础上,添加语句,即:

$ matlab -batch matlabfile 1>running1.log 2>running1.err

将标准输出流写入running1.log文件中,标准错误流写入running1.err文件中,这两个文件储存在当前目录下。具体可见文献3. 

亦可将所有输出均放到同一个文件内,即:

$ matlab -batch matlabfile >running1.log

数字0,1,2的含义:
0——stdin(standard input,标准输入),1——stdout(standard output,标准输出),2——stderr(standard error,标准错误

这里尤其需要明确的是,只有在root权限下才可实现进程后台运行。以下参考文献4和5,总结这几种方法。

  • 2.1. nohup

功能:将还未执行的程序置于后台运行。

语句:

# nohup command &

用nohup运行matlab的MAIN_SCRIPT.m文件之后,查询后台进程,如下

父进程号PPID为1,说明此进程不受终端的影响,可以后台运行。以下几种方法与此类似。

  • 2.2. setsid

功能:在新的会话中运行程序。

语句:

# setsid command

  • 2.3. disown

功能:使某个已在前端运行的job忽略HUP信号,从而不会被终端关闭所影响。

语句:

# disown -h %NUM

这里NUM是jobs的编号。

  • 2.4. screen

功能:首先用screen语句建立新的虚拟会话,然后可在该会话下进行操作,以Ctrl + a + d 来安全退出。用screen -r 返回处于断开模式下的会话(并指定会话名)。

语句:

# screen -r SESSIONNAME

这里SESSIONNAME是会话名称。

  • 2.5. ()

功能:将一个或多个命令包含在括号内,就能让这些命令在子shell中运行。

语句:

# (command &)

最后,介绍如何关闭正在运行的后台进程。

命令1:

$ kill -9 PID

这里,PID是进程号

命令2:

$ Ctrl + z

这里进程仅仅被暂停,而并未结束。

参考文献:

1. https://blog.csdn.net/sinat_33425327/article/details/79125745

2. https://blog.csdn.net/enjoyyl/article/details/44830519

3. https://blog.csdn.net/weixin_40098515/article/details/88535262

4. https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/

5. https://blog.csdn.net/v1v1wang/article/details/6855552

6. https://blog.csdn.net/liuyanfeier/article/details/62422742

发布了4 篇原创文章 · 获赞 1 · 访问量 659

猜你喜欢

转载自blog.csdn.net/u012395575/article/details/105684564