关于Linux前后台进程切换

前言:

当使用SSH远程登录服务器时,对于运行时间较长的程序(如Caffe的训练可能需要十几个小时),

SSH可能会在很长时间后断掉,导致程序没运行完就中断了。

为了解决这个问题,需要将在服务器运行的程序由“前台”转移到“后台”去。

经过几番探索,最终发现screen方法TMUX方法是最成熟最好用的(没有之一,不接受反驳):

相当于在远程服务器上开设了一个盒子,盒子里还是你的服务器。

在盒子里运行的程序不会收到SSH连接中断的影响。

随时连上服务器后只要进入盒子里,盒子的状态还和离开时一样,

这也方便了开展工作

 


 

TMUX方法:

https://gist.github.com/ryerh/14b7c24dfd623ef8edc7

 

 

对执行的命令后面加上&,直接放在后台执行

如python main.py --image_size 96 --output_size 48 --dataset faces --is_crop True --is_train True --epoch 300 --input_fname_pattern *.jpg &

用jobs可以查看当前正在运行的任务,

jobs -l是查看所有正在运行的任务

 

 

对于正在运行的程序,如果之前没有使用&,

则首先ctrl+z将其暂停,然后

bg %1可以把第一个任务放在后台运行

使用fg %1则可以把后台的进程变成前台的

 

以上都是在终端(XFTP)没有关闭过的前提下,

如果关闭过了又打开,则jobs没有用了,因为jobs只能查看在当前命令行窗口后台运行的程序

 

这时候可以使用ps命令查看所有运行的程序

使用ps -ef | grep python

查看正在运行的python程序

会显示程序的编号

 

如果想要关掉它

使用kill -9 2363

假设编号为2363,就可以关掉了

 

 

 

nohup ./test.sh & 

或者

setsid ./test.sh & 

然后输入exit,关闭终端,关闭XSHELL,再打开,使用ps -ef | grep python查看,还在

就搞定了


==============================

发现一个更高级的方法[2]:screen

说几个实用的:

screen -ls
列出当前正在运行的会话

screen -S bert
创建一个独立会话,名字叫做Bert

先按下Ctrl+a,然后输入w,列出所有已经创建的会话,其中*表示当前在哪个会话中

先按下Ctrl+a,然后输入d,可以将当前会话挂起,这时候可以关闭xshell,关闭电脑,然而在那边还在正常运行着

怎么回来呢?
先用screen -ls,看到

然后输入
screen -r 36763.bert
就能回去了
如果想要干掉已经detached的会话[3] (session),需要输入
screen -X -S 36763 quit

然后就好了

如果不小心关了电脑,但是screen会话还是attached的状态,这时候是进不去的,想关闭他的话,用下面的:
screen -X -S 36763 kill
就可以了



Reference:
  1. http://blog.csdn.net/zxh2075/article/details/52932885
  2. http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html
  3. http://nanxiao.me/kill-detached-screen-session/

posted on 2017-04-08 13:20  Oliver-cs  阅读(887)  评论(0编辑  收藏  举报

导航