Linux/Unix下,通常只有守护进程可在脱离终端的情况下能继续执行,而普通进程在关闭终端时会因收到SIGHUP信号(挂起信号)而退出。当终端退出后,由该终端启动的后台程序自动退出,像xshell等软件使用ssh协议进行远程连接时,实质上还是相当于在远程服务器上的终端,因此运行的普通进程会在退出终端时(包括xshell等软件)自动退出,但是可以使用一些方法来使进程后台运行(已运行的进程在退出终端后仍能继续运行)

这里介绍nohup&screen三种方式

&命令

  • &的作用是让程序在当前终端继续运行而终端可以接着执行其他命令,即在当前终端未被关闭的情况下在后台运行

ctrl z 挂起进程并放入后台
ctrl c 结束进程
jobs 显示当前暂停的进程
bg %N 使第N个任务在后台运行(%前有空格)
fg %N 使第N个任务在前台运行

nohup命令

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

该命令在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中

  • 语法格式

    1
    $ nohup Command [Arg...] [&]

    Command:要执行的命令。
    Arg:一些参数,可以指定输出文件。
    &:让命令在后台执行,终端退出后命令仍旧执行
    (实际测试不加&退出终端也能执行,区别在于不加&时终端会被该命令占用不能执行其他命令)

  • 例如后台执行程序

    1
    $ nohup ./run_program &
  • 需要重定向输出文件

    1
    $ nohup ./run_program > test.log 2>&1 &

    2>&1 解释:
    将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 test.log 文件中。

    0 – stdin (standard input,标准输入)
    1 – stdout (standard output,标准输出)
    2 – stderr (standard error,标准错误输出)

screen命令

通过screen,将执行的命令放到screen后台任务里,screen任务作为一个进程在服务器后台执行

一般情况下,只要没有人去kill你的screen任务进程,服务器也没有关机或重启操作,screen任务都会平稳运行

  • 创建screen任务
    1
    $ screen -S task

    这种方式创建的是一个有名字的screen任务,任务名为task

    1
    $ screen

    这种方式创建一个没有名字的screen任务

执行以上两种命令的任意一种后就进入了screenshell环境,此时执行的操作都是在该shell环境中运行的

  • 查看已创建的screen任务
    1
    $ screen -ls
    1
    2
    3
    There is a screen on:
    11010.Minecraft (06/26/2022 12:52:06 PM) (Detached)
    1 Socket in /run/screen/S-root.

    这里的11010就是该screen任务的piddetached表示后台运行,而Attached表示正在终端中运行

screenshell环境被进程占用而无法执行其他命令时,此时可以新开一个终端执行screen -d pidscreen -d task使其在后台运行,此时就能在原来的终端继续执行其他命令(其实可以直接关闭该终端,此时scrren中运行的进程仍然不受影响)

  • 进入screen任务

    1
    2
    $ screen -r pid
    $ screen -r task

    以上两种方式均可进入对应的screen任务,只不过分别是根据pid和任务名称进入该任务

  • 删除screen任务

    1
    $ exit

    进入screen任务后输入exit结束该任务

  • 结束进程

根据对应进程PID使用如下命令结束:

1
$ kill -9 [PID]

这几种方式的对比

  • &只能在当前终端后台运行,终端退出后进程也会随之退出
  • nohup则可以使进程在当前终端退出后也能接着运行
  • screennohup命令作用一样,但是某些进程使用nohup命令后台运行时可能无法正常工作,此时建议使用screen命令

参考文章:
Linux nohup 命令
Linux命令——后台运行(nohup 与 &)
screen的使用方法