Linux系统下如何保持进程在SSH客户端断开后仍继续运行?
使用场景
在Linux系统中,在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开SSH连接或关闭客户端软件,否则可能会导致执行中断。本文介绍两种保障程序在您退出登录后持续运行的方法。
方法1:使用nohup命令
1.命令格式
nohup,可以使运行的命令忽略SIGHUP信号。因此,即使退出登录,程序仍旧会继续执行。通常情况下,在nohup命令尾部加上&字符,才能将命令放至后台执行。具体示例如下所示:
nohup python hello.py > nohup.out &
在命令头尾分别加上nohup和&后Enter,可以看到nohup输出了一行信息,再Enter键就跳回了Shell命令行,此时命令已经在后台执行了,nohup将命令的输出重定向至当前目录的nohup.out文件(该文件名可自定义)中。同时,nohup会将对应程序的PID输出,PID可用于需要中断进程时结束进程。
2.程序监控
执行如下命令,可以持续的查看nohup.out的输出,达到监控程序的效果。
tail -f nohup.out
3.查看PID
使用ps命令查找该进程的进程ID(PID)。例如,执行以下命令可以查看所有运行中的Python进程:
ps -ef | grep python
4.结束进程
结束进程使用kill命令,其语法格式如下:
kill [signal] PID
其中,signal表示要发送的信号类型,PID表示要结束的进程ID。
常用的信号类型包括:
- 15(SIGTERM):默认信号,表示终止进程。
- 9(SIGKILL):强制终止进程,不能被进程忽略或捕获。
我们通常使用以下命令即可:
kill -9 PID
5.缺点
使用nohup命令的一个缺点就是不方便进行程序监控,只能通过写入到文件中的方式来”曲线救国“,但是这种方式可能导致写入的文件非常大,占据大量磁盘资源。
方法2:使用tmux终端复用工具
tmux是一个终端复用工具,它允许用户创建和管理多个会话(session),每个会话可以包含多个窗口(window),每个窗口又可以分成多个面板(pane)。使用tmux可以在同一个终端窗口中同时运行多个命令或程序,并且可以方便地切换、分离、合并会话等操作。
在第一次使用时需要安装,sudo apt install tmux
1.命令格式
tmux new -s [会话名] #创建会话
python main.py #执行一个程序或命令
tmux detach #退出会话
tmux ls #查看所有会话
tmux a -t [会话名] #重新进入会话
tmux kill-session -t [会话名] #删除指定会话
tmux kill-server #删除所有会话
2.在运行程序时如何退出tmux会话
要退出tmux会话,可以按下快捷键Ctrl-b
,然后输入:
来进入命令模式。在命令模式下,键入kill-session
或简写为kill
,这将关闭当前tmux会话并停止所有正在运行的程序。
如果我们想保留会话但暂时退出tmux,则可以按下快捷键Ctrl-b
,然后按下d
,这将使我们返回到终端并将tmux会话留在后台运行。