解决办法:
参考文章:https://blog.csdn.net/jiesunliu3215/article/details/128846628
【linux系统如何用Screen命令让程序在后台运行】_linux给screen内程序执行命令-CSDN博客
1. nohup+& -有时候不管用
在要处理的命令前加上 nohup ,在结尾加上 “&” 来将命令同时放入后台运行,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。也可用 “>filename 2>&1” 来更改缺省的重定向文件名。
-
安装命令
yum install coreutils
2. setsid
在要处理的命令前加上 setsid 即可。
[root@pythontab ~]# setsid ping www.baidu.com
[root@pythontab ~]# ps -ef |grep www.baidu.com
root 31094 1 0 07:28 ? 00:00:00 ping www.baidu.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.baidu.com
[root@pythontab ~]#
3. & subshell
将一个或多个命名包含在 “()” 中就能让这些命令在子 shell 中运行中,将 “&” 也放入 “()” 内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过 jobs 来查看的。
[root@pythontab ~]# (ping www.baidu.com &)
[root@pythontab ~]# ps -ef |grep www.baidu.com
root 16270 1 0 16:13 pts/4 00:00:00 ping www.baidu.com
root 16278 15362 0 16:13 pts/4 00:00:00 grep www.baidu.com
[root@pythontab ~]#
4. Screen(我认为最好用的)
screen 允许你启动一个虚拟终端会话,并在其中运行程序。即使你断开了SSH连接或关闭了终端,这个会话和其中运行的程序也会继续在后台运行。以下是如何使用 screen 来实现这一点的基本步骤:
4.1 安装 Screen(如果尚未安装):
在大多数Linux发行版中,screen 可能已经预装了。如果没有,你可以通过包管理器来安装它。例如,在Debian或Ubuntu上,你可以使用以下命令:
sudo apt-get install screen
4.2 启动 Screen 会话:
要启动一个新的Screen会话,只需输入 screen 命令。这将开启一个新的会话,并带你进入一个新的shell。
screen
4.3 在 Screen 会话中运行你的程序:
在screen会话中,你可以像在普通终端中一样运行任何程序。例如,如果你想在后台运行一个名为 my_script.sh 的脚本,只需在screen会话中运行它:
./my_script.sh
4.4 分离 Screen 会话:
当你的程序在运行时,你可以从screen会话中“分离”,使程序继续在后台运行。要做到这一点,同时按下 Ctrl + A,然后按 D。这会将你带回到原始的shell,而screen会话和其中的程序会在后台继续运行。
4.5 重新连接到 Screen 会话:
要重新连接到一个已经存在的screen会话,可以使用以下命令:
screen -r
如果有多个screen会话在运行,你可以列出所有会话并选择一个来重新连接:
screen -ls
screen -r [会话号]
4.6 关闭 Screen 会话:
当你完成了在screen会话中运行的程序,可以通过正常退出shell(例如输入 exit 或使用 Ctrl + D)来结束会话。如果需要强制关闭会话,可以使用以下命令:
screen -X -S [会话号] quit
假设你有一个Python脚本,名为example.py,你希望它在后台持续运行。我们将使用screen命令来实现这一目标。
以下是详细的步骤和示例:
1. 安装 Screen(如果尚未安装):
在Debian或Ubuntu上,你可以使用以下命令安装screen:
sudo apt-get install screen
2. 创建一个 Python 脚本:
假设你的Python脚本是一个简单的无限循环,打印当前时间。使用你喜欢的文本编辑器创建example.py:
import time
while True:
print("当前时间:", time.ctime())
time.sleep(10)
3. 启动 Screen 会话:
在终端中输入screen命令来启动一个新的screen会话:
screen
4.在 Screen 会话中运行你的 Python 脚本:
在screen会话中,切换到脚本所在的目录,并运行脚本:
python3 example.py
5.分离 Screen 会话:
当脚本开始运行后,你可以从screen会话中分离出来,让脚本继续在后台运行。同时按下 Ctrl + A,然后按 D。
6.查看 Screen 会话列表:
如果你想看看哪些screen会话在运行,可以用以下命令:
screen -ls
7.重新连接到特定的 Screen 会话:
如果你有多个screen会话在运行,你可以通过会话编号来重新连接到特定的会话。比如:
screen -r [会话号]
注意调用的时候没有[]
screen -r xxxxx
关闭 Screen 会话:
当你完成工作并想要停止脚本时,重新连接到对应的screen会话。然后,你可以通过在Python脚本运行的终端中输入Ctrl + C来停止脚本。接着,退出screen会话,只需输入exit或者按Ctrl + D。
这样,你的Python脚本将在一个screen会话中在后台运行,即使你断开SSH连接或关闭终端,它也会继续运行。通过使用screen,你可以轻松地管理在后台运行的长期或持续的进程。
要在开启时记录屏幕日志
(1)启动时添加选项-L(Turn on output logging.),会在当前目录下生成screenlog.0文件。如果执行-L命令后看不到新建的日志,可能是文件读写权限不够,e.g. sudo chmod 777 filename可以修改文件读写权限。
screen -L -dmS test #启动一个开始就处于断开模式的会话,会话的名称是test
screen -r test #连接该会话,在会话中的所有屏幕输出都会记录到screenlog.0文件。
(2)不加选项-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中的内容就比较混乱了。
(3)在screen配置文件/etc/screenrc最后添加下面一行:(建议)
1.建立日志存放目录
#mkdir /var/log/screen/
2.修改配置文件,在末尾添加配置内容
#vi /etc/screenrc
logfile /var/log/screen/%t.log
logfile /var/log/screen/%t_%Y%m%d.log
3.启动screen会话,保存日志
#screen -L -t log_name -dmS screen_name
4.监视日志
#tail /var/log/screen/log_name.log