使用 MobaXertm 连接服务器后,想要在运行一个下载任务,使用&挂在后台后,退出 MobaXterm,后台的任务也随之中断,于是搜到这个nohup命令,可以完成我的需求。

nohup意思是 No Hang Up,不要挂起的意思,即使退出终端也不会中断任务。

为了方便以后查阅,这里总结一下关于后台运行相关的命令。首先是最常用的&符号。

& 后台运行

比如执行编译任务时通常会占用终端前台,这时候无法再执行其他命令,除非再开一个终端,对于有 GUI 界面时,再开一个终端很方便,但是如果是服务器就只能再想办法了。 &可以将命令执行过程放在后台运行,如:

$ make  >  make.log  2>&1  & 
[1] 16586

2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了make.log文件,即将标准出错也输出到make.log文件中。最后一个&,是让该命令在后台执行。 试想2>1代表什么,2>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1&1结合就代表标准输出了,就变成错误重定向到标准输出。

在后台运行make进行编译,并将输出结果(错误和正常输出)都保存到make.log文件中,提交任务成功后,会显示进程 ID,编译的进程 ID 为 16586

有了进程 ID 我们可以监控,也可以中断进程:

# 查看进程状态
ps -ef | grep 16586
# 中断进程
kill -9 16586

但是使用 &时关闭终端后,进程也会随之关闭。如果想要在后台持续运行程序,就需要nohup命令。

nohup 使用

$ nohup make  >  make.log  2>&1  & 
[1] 112233

命令功能同上,但是终端关闭,后台程序也会继续执行。

NOTE:终端关闭,是指带 GUI 的界面里终端,如果使用 SSH 等登陆,比如使用 MobaXterm,一个 session 相当于一个登陆账户,如果异常退出了这个账户,那么后台执行的程序也会中断。如果需要继续执行,需要正常退出账户,执行exit命令。

汇总

fg        # 将后台中的命令调至前台继续运行
bg        # 将一个在后台暂停的命令,变成继续执行 (在后台执行)
jobs      # 查看当前有多少在后台运行的命令
kill %num # 终止进程num
&         # 加在命令后可以将其置于后台运行
ctrl + z  # 置于后台,并且暂停不可执行
ctrl + c  # 终止前台进程
ctrl + \  # 退出
ctrl + d  # 结束当前输入(即用户不再给当前程序发出指令),那么Linux通常将结束当前程序