关于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: