不少朋友都是用 Flask 框架來寫小服務器的,方便又快捷,還能一鍵運行,很舒服。不過,如果你真的想把你的服務部署到服務器上,那你就會發現其實還有一些功課要做,這篇文章裡,我們主要來談談如何將寫好的程序在服務器上變成一個服務而不是終端裡執行的命令。
如果我們用 Python 寫了一個網站應用,那麼它就需要一直運行來監聽 HTTP 請求,如果在終端直接執行
蟒蛇 主要.PY
那就太麻煩了,你還得一直保持終端開啟,端了 ssh,程序也就結束了。
起初,我是這麼做的:
nohup的 蟒蛇 -u /家/logcg/主要.PY > /家/logcg/出.日誌 2>&1 &
,Nohup 這個工具能讓程序在後台運行,這樣即使你斷開了 ssh,關閉了終端,服務器上的程序依舊在運行,如果你把這條命令寫到
RC.本地
,那麼它就能每次跟隨服務器啟動而啟動,完美……嗎?
這個解決方案看上去很完美,類似的還有比如 screen 等命令,但仔細一想,如果程序實行意外崩潰了怎麼辦?
——很遺憾,沒辦法,唯一的辦法就是等你的客戶告訴你:你的網站打不開了。
總之,現在我們可以用另一個工具直接將你的程序“變成”系統級服務,就像 Nginx,像 fail2ban 那樣,一旦程序崩潰,系統會負責將它重啟——除非你手動停止它。
監
這是一個純 Python 實現的工具,它是一個輕量級進程管理工具,能夠根據你的配置自動啟動並監控進程,一旦程序意外崩潰,它就會重新啟動它們。
1 2 |
apt install supervisor service supervisor restart |
啟動後,在
/等等/監/CONF.ð
目錄下寫入你的命令相關配置,最好是一個命令一個文件,方便管理,文件名要求是
.CONF
後綴。
比如,我有一個這樣的服務:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[program:logcg] command=gunicorn wsgi:app -c gunicorn.config.py ; 被监控的进程路径 directory=/home/logcg/ ; 执行前要不要先cd到目录$ autostart=true ; 随着supervisord的启动而启动 autorestart=true ; 自动重启。。当然要选上了 startretries=10 ; 启动失败时的最多重试次数 exitcodes=0 ; 正常退出代码 stopsignal=TERM ; 用来杀死进程的信号 默认 TERM,支持 gunicorn graceful restart stopwaitsecs=10 ; 发送SIGKILL前的等待时间 redirect_stderr=true ; 重定向stderr到stdout ; 默认为 false,如果设置为 true,当进程收到 stop 信号时,会自动将该信号发给该进$ stopasgroup=false ; send stop signal to the UNIX process ; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进$ killasgroup=false ; SIGKILL the UNIX process group (def false) |
這樣,我的 Python 程序就變成了一個叫做“logcg”的服務。
最後,
supervisorctl 更新 所有
更新所有服務的配置信息:
1 2 |
➜ supervisor supervisorctl update all logcg: added process group |
當然,你還可以使用命令
supervisorctl 狀態 所有
來查看所有服務的運行狀態,將
所有
換成特定的服務名稱,就能查詢單個的服務了。
這下,再也不用擔心因為一些意外的小問題導致程序崩潰再也起不來了。
報錯
Unix:///var / run / supervisor.sock沒有這樣的文件
如果你在更新軟件包後不幸遇到了這個錯誤,那你不是一個人,HTTPS://github.com/Supervisor/supervisor/issues/480 當然,
上面這個問題在新版的 Supervisor 中得到了解決,但如果你是持續更新的,那這個問題可能並不能自動修復,解決辦法是——重裝。
直接使用命令
易於 消除 監
然後
易於 消除 監
就可以了,原因是啟動腳本使用的路徑是
/USR/箱子/主管
而我們實際命令路徑是
/USR/本地/箱子/主管
,而你更新時並不會重建服務信息,於是它始終從錯誤的路徑啟動服務,於是服務啟動失敗,自然就報錯
Unix:///var / run / supervisor.sock沒有這樣的文件
了。
我們也有對應的解決辦法:
1 2 |
<del>touch /var/run/supervisor.sock supervisord -c /etc/supervisor/supervisord.conf</del> |
如果你是按照本文進行配置的,那隻需要復制粘貼執行這兩條語句就好了,第一句是手動創建這個.sock文件,以供 supervisor 讀取,第二句是讓 supervisord 以默認配置進行啟動一下,然後就可以正常使用了。
參考文獻
本文由 落格博客 原創撰寫:落格博客 » 使用 Supervisor 將你的 Python 程序變成服務
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3304.html
博主說的好,我選擇systemd🐒🐒
不行不行,還得寫腳本加進去……不會啊