学无先后,达者为师

网站首页 编程语言 正文

Linux系统SSH客户端断开后保持进程继续运行配置方法;Python等脚本在终端后台运行的方法

作者:别出BUG求求了 更新时间: 2023-11-15 编程语言

0. 概述

在Linux系统中,通常我们在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开SSH连接或关闭客户端软件,否则可能会导致执行中断。本文介绍几种保障程序在用户退出登录后持续运行的方法。

一、方法

1. 使用nohup执行

nohup可以使后面的命令不会响应挂断(SIGHUP)信号。也就是说,通过远程登录执行nohup命令后,即使退出登录后,程序还是会正常执行。通常情况下,nohup命令最后会跟上&字符,表示将这个命令放至后台执行,这样才能真正做到将这个命令放至后台持续的执行。具体示例如下所示。

提示:nohup通常用于执行无干预的自动化程序或脚本,无法完成带有交互的操作。

  • 执行如下命令,每秒输出一行信息。
bash hello.sh

系统显示类似如下。

在这里插入图片描述

  • 在命令头尾分别加上nohup和&,如下所示,可以看到nohup输出了一行信息,再按一下回车键就跳回了Shell命令行,此时命令已经在后台执行了,nohup将命令的输出重定向至当前目录的nohup.out文件中。同时注意到nohup会将对应程序的PID输出,PID可用于需要中断进程时结束进程。
nohup bash hello.sh &

系统显示类似如下。
在这里插入图片描述

  • 通过如下命令,可以持续的查看nohup.out的输出,达到监视程序的效果
tail -f nohup.out
  • 在命令中也可以使用重定向将程序的输出改为自己想要的文件名,如下所示,则程序的输出就会写到hello.log文件中
nohup bash hello.sh >hello.log &
  • 若程序不会自动退出,那么此时需要使用kill命令来结束进程。例如,可以使用如下命令,结束进程
kill -TRM [$PID]

说明:[$PID]为之前nohup命令输出的值。

  • 如果不需要输出日志的话,命令如下。
nohup ./run.sh >/dev/null 2>&1 &

关于/dev/null

/dev/null属于字符特殊文件,它属于空设备,是一个特殊的设备文件,它会丢弃一切写入其中的数据,写入它的内容都会永远丢失,而且没有任何可以读取的内容。它就像一个黑洞,我们一般会把/dev/null当成一个垃圾站,不要的东西丢进去。比如来清除文件中的内容。

Linux的重定向

0:表示标准输入;

1:标准输出,在一般使用时,默认的是标准输出;

2:表示错误信息输出。

./run.sh >/dev/null 2>log表示将run.sh的错误信息输出到log文件,其他信息丢进/dev/null。

./run.sh >/dev/null 2>&1表示将run.sh的错误信息重定向到标准输出,其他信息丢

2. 使用screen执行

(1)基本用法

  • 安装screen工具

Linux系统默认没有screen工具,需要先进行安装。

说明:CentOS 6与CentOS 8操作系统版本结束了生命周期(EOL),按照社区规则,CentOS 6/8的源地址内容已移除。当您在CentOS 6/8系统内继续使用默认配置的源地址时会发生报错。建议您先切换CentOS 6/8的源地址,然后再进行操作。具体操作,请参见CentOS 6 EOL如何切换源?和CentOS 8 EOL如何切换源?。

CentOS系列系统安装命令如下所示

yum install screen

Ubuntu 系列系统安装命令如下所示

sudo  apt-get  install screen
  • 使用方法:
    (1)执行如下命令,创建screen窗口。
screen -S [$Name]

screen -S [$Name]

(2)执行如下命令,列出screen窗口

screen -ls

系统显示类似如下。
在这里插入图片描述
(3)当需要运行脚本、执行程序时,在命令前添加screen即可。

(4)然后使用Ctrl和a键,再按下d键,就可以退出窗口,但不会影响screen程序的运行。

# 断开当前窗口(继续运行)
键入 ctrl + a + d

此时,可以退出ssh连接:

# 退出当前窗口
exit

(5)若需要继续工作时,登录实例,然后执行如下命令-输入刚刚创建的screen的号码,恢复会话即可。

screen -r 16751

(2)进阶用法

使用screen难免遇到这种情况,当screen输出太长时屏幕滚动,不能看到全部信息。
解决这个问题可以将输出打印到日志中。

  • 第一种方法:
    启动时添加选项-L(Turn on output logging.),会在当前目录下生成screenlog.0文件。
screen -L -dmS test #启动一个开始就处于断开模式的会话,会话的名称是test
screen -r test #连接该会话,在会话中的所有屏幕输出都会记录到screenlog.0文件。

注: 如果执行-L命令后看不到新建的日志,可能是文件读写权限不够,e.g. sudo chmod 777
filename可以修改文件读写权限。

  • 第二种方法:

不加选项-L,启动后,在screen session下按ctrl+a H,同样会在当前目录下生成screenlog.0文件。

第一次按下ctrl+a H,屏幕左下角会提示Creating logfile “screenlog.0”.,开始记录日志。

再次按下ctrl+a H,屏幕左下角会提示Logfile “screenlog.0” closed.,停止记录日志。

上面两个方法有个缺点:当创建多个screen会话的时候,每个会话都会记录日志到screenlog.0文件。screenlog.0中的内容就比较混乱了。

解决方法: 让每个screen会话窗口有单独的日志文件。

  • 第三种方法(推荐):

在screen配置文件/etc/screenrc最后添加下面一行:

logfile /tmp/screenlog_%t.log

注意,如果写成:logfile ./screenlog_%t.log 则是把日志文件记录到当前目录下
%t是指window窗口的名称,对应screen的-t参数。所以我们启动screen的时候要指定窗口的名称,例如:

screen -L -t window1 -S test

意思是启动test会话,窗口名称为window1。屏幕日志记录在/tmp/screenlog_window1.log。

如果启动的时候不加-L参数,在screen session下按ctrl+a H,日志也会记录在/tmp/screenlog_window1.log。

(3)报错解决

最近在使用screen 命令创建会话的时候,突然不小心将我的终端关闭了,然后重新连接再次打开我之前创建的会话的时候出现了下面这句错误:

(pytorch) root@dev-chq-caa:/private# screen -r 74308.n There is a
screen on:
74308.n (08/17/21 21:11:47) (Attached) There is no screen to be resumed matching 74308.n.

  • 原因:虽然重新连接,但之前的screen还是处于打开状态(1个screen无法同时打开2次),所以无法重新打开screen

  • 解决方案

首先使用screen -d id,先退出。

(pytorch) root@dev-chq-caa:/private# screen -d 74308
[74308.n detached.]

然后再使用 screen -r id重新连接

原文链接:https://blog.csdn.net/weixin_39589455/article/details/128459897

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新