起因

我用SSH软件可以连接到Linux服务器,不过一旦关闭SSH软件,Linux上跑的程序直接终止了。比如说我在Linux上运行一个Http服务器,为了维持运行,只能保持SSH软件开启,不过这根本就不合理啊,浪费了Linux服务器资源。所以呢,必须找到一个合适的办法,让程序长期跑在后台。

nohup

原理

使用pstree后可以看到以下画面,我这里使用SSH客户端连接到了Linux服务器,并开启了两个终端,一个使用ping,一个使用pstree。当SSH客户端断开连接后,终端的会话就会结束。此时你运行的前台程序就会收到(SIGHUP)信号。默认情况下就会导致前台程序终止。

nohup原理

使用nohup后,这将使得运行的程序忽略挂断信号,并且不会受到SSH连接断开的影响。程序的输出也会被重定向到nohup.out文件中,便于查询执行过程。此时运行的程序就会被托管到init进程(进程号为1)下。

用法

nohup ./your_program &

setsid

作用

setsid 的主要作用是将进程从当前终端分离出来,使其在后台独立运行,不受终端关闭或终端信号的影响。它常常与其他命令或进程一起使用,以确保进程在后台持续运行,即使终端会话结束。使用该命令后,进程会被init进程托管,这一段和nohup很像,不过一般为了查看输出,需要使用重定向符。

用法

setsid ./your_program # 未设置重定向
setsid ./your_program > output.txt # 将输出重定向到文件
setsid ./your_program < input.txt # 将输入重定向为文件

screen

说明

Screen是一个在Linux和类Unix系统上运行的终端复用工具。它允许用户在一个终端会话中创建多个虚拟终端,并在其中运行多个程序或会话。Screen提供了一种持久化的会话环境,即使SSH连接断开或终端关闭,用户也可以重新连接到会话并继续之前的工作。和前面两种不同,此时程序被screen托管,而不是被init托管。不过使用前要先安装sudo apt install screen

常用命令

screen # 创建screen终端
Ctrl+a d # 离开screen终端
screen -ls # 显示已创建的screen终端
screen -r screen_id #重新连接已经离开的screen终端

补充知识

apt update

apt update 是一个用于更新软件包列表的命令。在Ubuntu和其他基于Debian的Linux发行版中,apt update 命令用于与软件包管理系统的软件(repositories)通信,并获取最新的软件包信息。通过运行 apt update,系统会同步本地的软件包信息和远程软件源服务器上的软件包信息。这样可以确保你的本地软件包信息是最新的,从而能够正确地获取并安装最新的软件包版本。

apt upgrade

apt upgrade 是一个用于升级已安装软件包的命令。在Ubuntu和其他基于Debian的Linux发行版中,apt upgrade 命令用于检查系统中已安装软件包的新版本,并执行升级操作,将这些软件包更新到最新可用的版本。在运行 apt upgrade 之前,建议先运行 apt update 命令来更新软件包列表,以确保获取到最新的软件包版本信息。

其他Linux命令汇总

kill -9 PID # 杀死进程
pstree # 查看进程数
ps -ef | grep info # 查看特定进程的进程号和父进程