Linux后台运行及不挂断相关命令

背景

我们经常会遇到这种需求:ssh到Linux服务器上,跑一个耗时比较久的任务,比如编译任务等,有时候由于网络不好,网络故障,或者不小心将跑任务的终端关闭了(也有可能是跑终端的机器异常了),导致好不容易跑了很久的任务中断退出,前面跑的白费了,又不得不重新跑!此时的你是不是很郁闷。。。
该咋解决呢?就是今天介绍的几个主角:nohupscreen&

command &

大家可能对这个最为熟悉,&表示将前面的 command 任务放入后台,单独起一个进程来运行,使用Ctrl + C无法中止该任务,此时你可以继续在该终端上做其他事情,但如果关闭该终端,该任务进程会跟着退出。

nohup command

nohup 是 no hung up的缩写,顾名思义就是不挂断,忽略挂起信号运行后面的 command 。所以它并没有后台运行的功能,只是会将任务永久执行,无论是否关闭终端,断开ssh等。
nohup 命令,在默认情况下(非重定向时),标准输出会输出到当前目录下 nohup.out 文件中,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

nohup一般常用的用法是和&结合使用(nohup + 后台启动 ):

nohup command > output.log 2>&1 &

说明:

  • 2>&1:表示将命令的标准错误输出重定向到标准输出中一起输出。
  • 如果不想输出日志,可以重定向到/dev/null
  • 如果不想不停止服务,清空默认输出nohup.out,有以下2种方法:
    # 第1种:
    cat /dev/null > nohup.out
     
    # 第2种:
    cp /dev/null nohup.out

注意:服务正在运行时千万别直接删除日志文件nohup.out

screen

screen - screen manager with VT100/ANSI terminal emulation

screen一般是需要单独安装的,可以理解为是一个会话窗口管理工具。在本质上,这意味着你能够使用一个单一的终端窗口运行多终端的应用。

以编译任务为例,一个简单的使用流程:

1. 执行screen命令
2. 开始编译
3. 关闭SSH
......去喝一杯水,或者忙其他事情......
4. 连接SSH
5. screen -r
6. 查看编译进度

更详细的使用,可参考 help 或者 man 文档。

参考

https://blog.csdn.net/weixin_49114503/article/details/134266408