通过rc.local开机自启执行nohup命令运行Flask,nohup.out中没有Flask请求响应日志

需求

通过修改/etc/rc.d/rc.local,实现开机自启Flask服务,CentOS 7.9。rc.local参考链接1,参考链接2。

问题

在/etc/rc.d/rc.local中添加

bash 复制代码
/home/python/face_jiance/kaijiziqi.sh

在/home/python/face_jiance/kaijiziqi.sh中写

bash 复制代码
nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py > /home/python/face_jiance/nohup.out &

用chmod +x命令给rc.local和kaijiziqi.sh加可执行权限。

另外有些文章说还需要重启rc-local.service,我没重启这个服务,参考链接3。

重启服务器后,nohup.out中的信息不全,没有Flask接口收到的请求的记录,也没有Flask的启动ip和端口信息。而手动执行上面的nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py > /home/python/face_jiance/nohup.out &后nohup.out中的信息是完整的,有Flask接口收到的请求的记录,也有Flask的启动ip和端口信息。整个过程中外部一直在请求这个Flask接口。
手动执行nohup命令,启动flask服务 通过rc.local开机自启flask服务

解决

有人说用python -u,我试了不行。

方法一

就是在原来命令末尾&前加2>&1

bash 复制代码
nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py > /home/python/face_jiance/nohup.out 2>&1 &

方法二

就是把原来命令中>改成&>

bash 复制代码
nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py &> /home/python/face_jiance/nohup.out &

原因

首先需要了解下标准输出stdout和标准错误stderr和重定向,在文章末尾的参考链接。

1. Flask的这些日志,默认交给stderr,这项默认设置也可以删除。Flask文档

缺省配置

如果没有自己配置日志, Flask 会自动添加一个 StreamHandlerapp.logger 。 在请求过程中,它会写到由 WSGI 服务器指定的,保存在 environ['wsgi.errors'] 变量中的日志流(通常是 sys.stderr ) 中。在请求之外,则会记录到 sys.stderr

移除缺省配置

如果在操作 app.logger 之后配置日志,并且需要 移除缺省的日志记录器,可以导入并移除它:

复制代码
from flask.logging import default_handler
app.logger.removeHandler(default_handler)

**2.**nohup --help中有一句

If standard error is a terminal, redirect it to standard output.

所以手动执行nohup时,Flask日志被重定向到stdout,然后存到nohup.out中。这是手动执行nohup得到的信息就完整的原因。

**3.**那为什么手动执行可以,开机自启就不行?开机自启的stderr可能不是在terminal的,所以就没有自动重定向到stdout了,而手动指定的方式就是2>&1,或&>。

4. 在rc.local文件中的命令的stderr输出到系统日志,如/var/log/syslog或/var/log/messages,参考链接4,参考链接5,参考链接6,也就是我的最开始的nohup命令

bash 复制代码
nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py > /home/python/face_jiance/nohup.out &

它的Flask的详细日志,我这里在/var/log/messages,收到的请求的记录也有,太多了没截图

还可以用tail -f /var/log/messages查看最新的日志。

排查过程

以下大部分内容是咨询群友的。

怀疑终端环境变量让stderr重定向到了stdout。

理论上来说,在终端手动运行这句命令,stderr只会输出到终端。(后来知道实际是nohup自动重定向了)

strace -o strace.log -f sh kaijiziqi.sh看看dup2把stderr重定向到哪去了

然后cat strace.log | grep "dup2"

把2重定向到1了,猜测是环境变量有问题。

然后群友自己又试了下,发现nohup会自动将2重定向到1,再就看了nohup --help就明白了。感谢群友的帮助。

参考链接

一文直接搞懂什么是标准输出/错误重定向 (qq.com)

到底什么是标准输入输出 (qq.com)

Linux的标准输入和输出 (qq.com)

一日一技:怎么>重定向不过去了? (qq.com)

第 B 章 Linux Shell 脚本 (brinnatt.com)

open-c-book/zh/chapters/02-chapter3.markdown at master · tinyclub/open-c-book · GitHub

apachecn-linux-zh/docs/rhel8-admin/03.md at master · apachecn/apachecn-linux-zh · GitHub

牛客网刷题错题记录(Linux)

Shell 脚本编程详解 | Front-End-Basics (chenfangxu.com)

Linux进阶(命令行,系统配置,内存管理,进程,信号) | 扔掉笔记 ᐛ (whatsrtos.github.io)

Flask Python Flask将访问日志写入标准错误流|极客笔记 (deepinout.com)

Python Flask writes access log to STDERR - Stack Overflow

skills_centos - mediocrep - 博客园 (cnblogs.com)

相关推荐
AllData公司负责人15 分钟前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
charlie1145141911 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
Flittly1 小时前
【LangGraph新手村系列】(5)时间旅行:浏览历史、分叉时间线与修改过去
python·langchain
飞Link1 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
消失的旧时光-19432 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
2301_782040452 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
SWAGGY..2 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
yaoxin5211232 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
kdxiaojie2 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
烛衔溟2 小时前
TypeScript 接口继承与混合类型
linux·ubuntu·typescript