Linux服务器SSH客户端断开后保持程序继续运行的方法

前言

在申请服务器连接到桌面后,有些时候需要跑一些运行时间很长的程序(深度学习的训练程序)。在这期间如果退出断开连接,即:关闭桌面的编辑器或网页端的jupyter界面后Linux系统会自动关闭所有进程,程序也会随之终止运行(被挂起),这是不希望看到的,因此本文将通过使用nohup命令教大家一种在用户关闭编辑软件程序仍保持运行的方法。

一、在终端界面运行程序

首先在终端界面打开要执行程序的所在目录,使用如下命令开始运行程序:

nohup 程序运行的编译器 程序名称(带有文件类型后缀) &

例如,我要运行main_attetion_train.py程序,它使用python编译器进行编译,该文件相对于当前终端的位置在:data/ygw/NESP/working目录下。因此我的运行命令需要这样写:

cd data/ygw/NESP/working
nohup python main_attetion_train.py &

运行结果如下:
在这里插入图片描述
从图中看出在执行了这两条命令出现了两行输出:
第一行出现了[1] 23024的字样,“[1]”是此进程的编号,“23024”是本次运行程序在linux中的进程号PID,这个在后期手动结束进程的时候需要,一定要记下来!!!
第二行出现的字样就是程序运行成功的标致,意思是将程序的输出日志信息放到“nohup.out”文件中存储,如果在执行程序后发现该行出现的字样与上图的不符,应该就是没有执行成功。

二、监视和查看程序的运行情况

在成功执行程序后,可以通过如下命令查看程序的运行情况:

tail -f nohup.out

这个nohup.out就上在运行程序时nohup命令指定的日志信息存储文件,它也在当前终端对应的目录下,所以除了用此命令在终端中查看内容也可以直接找到这个文件用记事本打开查看。
例如我在运行程序后输入此命令显示:
Linux服务器SSH客户端断开后保持程序继续运行的方法_第1张图片
其中文件里的内容就是程序执行时输出的日志信息。

Tick:对于深度学习程序来讲我们可以通过实时查看GPU的使用情况来判断程序是否在运行。查看GPU当前使用情况的命令是:

python nvidia-smi

我在运行程序前查看的GPU信息为:
Linux服务器SSH客户端断开后保持程序继续运行的方法_第2张图片
可以看出此时的GPU现存使用率为0,也就是当前没有什么进程在使用GPU。
当我把程序运行起来后再查看GPU的信息:
Linux服务器SSH客户端断开后保持程序继续运行的方法_第3张图片
此时发现GPU基本是满功耗运行,从侧面印证了程序在正常运行。

三、结束程序

现在运行的程序被设置为了不会随客户端断而终止的程序,所以在我们就得通过手动命令的形式在我们需要终端的时候终止程序,否则它就会一直执行到结束为止。终止程序可以采用Linux系统中的强制结束进程的方法,命令为:

kill -9 进程号

这里说一下,kill是一个命令组,后面跟的数字不同对应的kill效果不同,-9表示强制杀死进程,对kill其它使用方法有兴趣的小伙伴可以去自行查阅。这里只需要强制结束进程的效果,所以只介绍kill -9
下面以我的程序为例展示结束程序(杀死进程)的方法:
对第一步运行程序的时候通过输出端看到程序的进程号为:2304,因此需要执行的具体命令为:

kill -9 23024

在这里插入图片描述
执行后会弹出[1]+ Killed的提示,说明命令执行成功。为了再次验证程序是否终止,可以查看此时GPU的使用率:
Linux服务器SSH客户端断开后保持程序继续运行的方法_第4张图片
从GPU使用信息中可以看出,此时GPU几乎无占用率,说明程序确实终止运行了。

四、忘记PID号的补救措施——查看运行程序的PID

一定有小伙伴在运行程序后关闭了终端页面,忘记了程序的PID号(我第一次就是这样)。这时可以通过查看目前终端中正在执行程序的PID号来找出之前程序的PID号。命令为:

ps -e|grep 程序的运行类型

这里我的程序运行类型为python,所以我的操作为:

ps -e|grep python

运行结果为:
在这里插入图片描述
可以看到PID号为:23195。然后再执行kill命令就可以了。
PS1:上一个程序已经结束,为了演示我又从新运行了程序,所以现在的PID号和上面的那个不一样。
PS2:这里我的系统只开了一个python进程,所以很容易找到程序的PID号,当系统同时开了很多python进程的时候就很难定位要停止的python进程对应的PID号(此时可以通过估计自己程序的执行时间来确定,就是python字样前面的那个00:00:40),这个表示目前这个进程执行了40s。当然还是建议记住PID号,这个估计的找法在有多个进程时容易弄错!!!

五、总结

通过上述方法可以使得程序在关闭客户端后仍然运行,这可以解放我们的电脑。同时相比于那种申请训练任务直接执行的模式,这种连接可以充分发挥桌面调试的优势(任务+调试模式兼得),不至于当程序中存在错误时直接导致训练任务失败,再次运行就需要重新申请。对于不想刷爆实验室集群服务器申请记录的小白来说是十分友好的。

你可能感兴趣的:(环境配置,服务器,linux,ssh,python)