需求
通過修改/etc/rc.d/rc.local,實現開機自啟Flask服務,CentOS 7.9。rc.local參考鏈接1,參考鏈接2。
問題
在/etc/rc.d/rc.local中添加
/home/python/face_jiance/kaijiziqi.sh
在/home/python/face_jiance/kaijiziqi.sh中寫
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接口。


?解決
有人說用python -u,我試了不行。
方法一
就是在原來命令末尾&前加2>&1
nohup /root/miniconda3/envs/face_jiance/bin/python /home/python/face_jiance/face_jiance.py > /home/python/face_jiance/nohup.out 2>&1 &
方法二
就是把原來命令中>改成&>
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 會自動添加一個?StreamHandler?到?app.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命令
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)