欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux中nohup的使用

程序员文章站 2022-03-20 11:13:55
...

之前因为需求,搭建的一个后台程序需要在Linux的服务器上挂载,在Linux服务器中,想要在后台运行程序,需要使用nohup命令来运行。

nohup命令

nohup的意思就是不挂断地运行命令,是no hang up的缩写,nohup命令忽略所有的挂断信号(SIGHUP)
语法

nohup Command [ Arg ... ] [ & ]

其中Command是指运行程序的命令,例如若要运行test.py程序,则Command部分就是python3 test.py

&

&是将进程提交到后台运行的命令,这样你就可以在控制台终端做其他事情,但是当把当前控制台(终端)关闭(退出账户)时,进程就会停止运行。
而nohup命令,可以保护进程在退出账户,释放连接后继续运行,所以使用该命令一般的形式是:

nohup command &

&让进程转至后台运行,nohup让进程不会由于退出账户停止。

而如果想让进程停止,可以通过使用ps -ef来查看进程的pid。
然后kill掉pid来结束进程。

为什么关闭SSH连接,程序就停止运行?

要想回答这个问题,首先需要知道在Linux系统下有这两个概念:
进程组:一个或者多个进程的集合,每一个进程组都有唯一一个进程组ID,即进程组长进程的ID。
会话期:一个或多个进程组的集合,有唯一一个会话期首进程。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端。与控制终端连接的会话期首进程叫做控制进程。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程。
如果控制进程终止,则该信号发送到该会话期前台进程组。

结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

也就是说:当SSH连接开启的时候,bash等都会成为其进程组成员,当ssh关闭后,系统会将所有相关进程kill掉。

相关标签: Linux nohup