最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python實(shí)現(xiàn)自動(dòng)化監(jiān)控文件夾完成服務(wù)部署

 更新時(shí)間:2022年07月04日 14:03:32   作者:星安果  
本篇文章將為大家詳細(xì)介紹如何利用Python語言實(shí)現(xiàn)監(jiān)控文件夾,以此輔助完成服務(wù)的部署動(dòng)作,文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下

大家好,我是安果!

最近在部署前端項(xiàng)目的時(shí)候,需要先將前端項(xiàng)目壓縮包通過堡壘機(jī)上傳到應(yīng)用服務(wù)器的 /tmp 目錄下,然后進(jìn)入應(yīng)用服務(wù)器中,使用 mv 命令將壓縮文件移動(dòng)到 Nginx 項(xiàng)目設(shè)定目錄,最后使用 unzip 命令解壓文件,以此完成項(xiàng)目的部署

仔細(xì)分析,大部分操作都是重復(fù)性的動(dòng)作,人工去完成這些操作會(huì)大大降低工作效率

本篇文章將介紹如何利用 Python 監(jiān)控文件夾,以此輔助完成服務(wù)的部署動(dòng)作

1. 準(zhǔn)備

這里要介紹一個(gè) Python 依賴庫「 watchdog 」

它可用于監(jiān)控某個(gè)文件目錄下的文件變化,包含:刪除、修改、新增等操,每一個(gè)操作都會(huì)回調(diào)一個(gè)事件函數(shù),我們可以在內(nèi)部編寫自定義的邏輯,以此滿足我們的需求

#?安裝依賴包
pip3?install?watchdog

項(xiàng)目地址

2. 實(shí)戰(zhàn)一下

首先,我們需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽器,用于監(jiān)聽文件夾目錄

from?watchdog.observers?import?Observer

...
#?創(chuàng)建一個(gè)監(jiān)聽器,用來監(jiān)聽文件夾目錄
observer?=?Observer()
...

然后,創(chuàng)建 2 個(gè)事件處理對(duì)象

PS:該對(duì)象繼承于「 FileSystemEventHandler 」類

它們分別用于監(jiān)聽「 /tmp 」目錄、「 /home/project/frontend 」目錄,假設(shè)事件對(duì)象被命名為 obj1、obj2

obj1 負(fù)責(zé)監(jiān)聽 /tmp 目錄,重寫「 新建或修改 」事件方法,完成壓縮文件的移動(dòng)操作

from?watchdog.events?import?*
import?ntpath
import?shutil
import?zipfile

def?get_filename(filepath):
????"""
????根據(jù)文件夾目錄,獲取文件名稱(待后綴)
????:param?filepath:
????:return:
????"""
????return?ntpath.basename(filepath)

class?FileMoveHandler(FileSystemEventHandler):
????def?__init__(self):
????????FileSystemEventHandler.__init__(self)

????...

????#?文件新建
????def?on_created(self,?event):
????????#?新建文件夾
????????if?event.is_directory:
????????????#?print("directory?created:{0}".format(event.src_path))
????????????pass
????????#?新建文件
????????else:
????????????#?print("file?created:{0}".format(event.src_path))
????????????filename?=?get_filename(event.src_path)

????????????#?如果屬于前端的4個(gè)項(xiàng)目壓縮包,開始文件夾的操作
????????????if?filename?in?watch_tags:
????????????????self.start(filename)
???...
???def?on_modified(self,?event):
????????if?event.is_directory:
????????????#?print("directory?modified:{0}".format(event.src_path))
????????????pass
????????else:
????????????#?print("file?modified:{0}".format(event.src_path))
????????????filename?=?get_filename(event.src_path)
????????????if?filename?in?watch_tags:
????????????????self.start(filename)
????...
????????def?start(self,?filename):
????????"""
????????文件處理邏輯
????????:param?filename:
????????:return:
????????"""
????????try:
????????????#?文件名不帶后綴
????????????filename_without_suffix?=?filename.split(".")[0]

????????????#?源文件路徑(壓縮包文件)
????????????source_file_path?=?watch_folder?+?filename

????????????#?目標(biāo)文件路徑(壓縮包文件)
????????????target_file_path?=?target_folder?+?filename

????????????#?目標(biāo)項(xiàng)目文件夾(目標(biāo)項(xiàng)目)
????????????target_project_path?=?target_folder?+?filename_without_suffix

????????????#?1、復(fù)制文件到目標(biāo)文件夾
????????????print(f"拷貝源目錄{source_file_path},目標(biāo)文件夾:{target_folder}")
????????????#?刪除目標(biāo)文件夾下的壓縮文件
????????????if?os.path.exists(target_file_path):
????????????????os.remove(target_file_path)
????????????#?移動(dòng)文件到目標(biāo)文件夾中
????????????shutil.move(source_file_path,?target_folder)

????????????#?2、清空目標(biāo)文件夾中內(nèi)的所有文件夾(如果存在)
????????????#?如果不存在,新建一個(gè)文件夾
????????????if?os.path.exists(target_project_path):
????????????????shutil.rmtree(target_project_path,?ignore_errors=True)

????????????print(f"項(xiàng)目{filename_without_suffix}移動(dòng)成功!")
????????except?Exception?as?e:
????????????print("部署失敗,錯(cuò)誤原因:",?str(e.args))

obj2 負(fù)責(zé)監(jiān)聽 /home/project/frontend 目錄,同樣重寫「 新建或修改 」事件方法,完成壓縮文件的解壓動(dòng)作

...
????def?start(self,?filename):
????????#?文件名不帶后綴
????????filename_without_suffix?=?filename.split(".")[0]
????????#?目標(biāo)文件路徑(壓縮包文件)
????????target_file_path?=?target_folder?+?filename

????????#?目標(biāo)項(xiàng)目文件夾(目標(biāo)項(xiàng)目)
????????target_project_path?=?target_folder?+?filename_without_suffix
????????r?=?zipfile.is_zipfile(target_file_path)
????????if?r:
????????????fz?=?zipfile.ZipFile(target_file_path,?'r')
????????????for?file?in?fz.namelist():
????????????????fz.extract(file,?target_folder)
????????else:
????????????print('這不是一個(gè)正常的zip壓縮包!')
...

接著,通過監(jiān)聽器啟動(dòng)上面兩個(gè)事件的監(jiān)聽任務(wù)

import?time
...
if?__name__?==?"__main__":
????#?待監(jiān)聽的文件夾目錄
????watch_folder?=?"/tmp/"

????#?項(xiàng)目目標(biāo)文件夾目錄
????target_folder?=?"/home/project/frontend/"

????#?監(jiān)聽文件夾名稱,即:項(xiàng)目壓縮包名稱
????watch_tags?=?['proj1.zip',?'proj2.zip',?'proj3.zip',?'proj4.zip']

????#?創(chuàng)建一個(gè)監(jiān)聽器,用來監(jiān)聽文件夾目錄
????observer?=?Observer()

????#?創(chuàng)建兩個(gè)事件處理對(duì)象
????move_handler?=?FileMoveHandler()
????unzip_handler?=?FileUnzipHandler()

????#?啟動(dòng)監(jiān)控任務(wù)
????#?參數(shù)分別是:觀察者、監(jiān)聽目錄、是否監(jiān)聽子目錄
????observer.schedule(move_handler,?watch_folder,?True)
????observer.schedule(unzip_handler,?target_folder,?True)
????observer.start()
????try:
????????while?True:
????????????time.sleep(1)
????except?KeyboardInterrupt:
????????observer.stop()
????observer.join()
...

最后,我們?cè)诜?wù)器上通過「 nohup 」命令,讓文件監(jiān)聽程序在后臺(tái)運(yùn)行即可

#?在后臺(tái)運(yùn)行??
#?項(xiàng)目文件:watch_folder.py
#?日志文件:watch_folder.log
nohup?python3?-u?watch_folder.py?>?watch_folder.log?2>&1?&

#?查看日志:
cat?watch_folder.log

3. 總結(jié)

通過上面的操作,每次我通過堡壘機(jī)將前端 zip 壓縮項(xiàng)目文件上傳到應(yīng)用服務(wù)器的 /tmp 目錄下,程序會(huì)自動(dòng)進(jìn)行后面的操作,自動(dòng)完成應(yīng)用部署

到此這篇關(guān)于利用Python實(shí)現(xiàn)自動(dòng)化監(jiān)控文件夾完成服務(wù)部署的文章就介紹到這了,更多相關(guān)Python監(jiān)控文件夾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語拼音的庫

    python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語拼音的庫

    這篇文章主要介紹了python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語拼音的庫,涉及Python調(diào)用word.data字段實(shí)現(xiàn)將漢字轉(zhuǎn)換成拼音的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 使用PyGame顯示圖像的四種方案實(shí)例代碼

    使用PyGame顯示圖像的四種方案實(shí)例代碼

    由于前面學(xué)習(xí)了使用pygame的簡(jiǎn)單操作,現(xiàn)在學(xué)習(xí)當(dāng)前的pygame怎么加載圖片,下面這篇文章主要給大家介紹了關(guān)于使用PyGame顯示圖像的四種方案,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • python代理工具mitmproxy使用指南

    python代理工具mitmproxy使用指南

    這篇文章主要介紹了python mitmproxy 使用指南,mitmproxy 可以用來攔截、修改、保存 HTTP/HTTPS 請(qǐng)求。以命令行終端形式呈現(xiàn),類似于 Chrome 瀏覽器開發(fā)者模式的可視化工具,需要的朋友可以參考下
    2019-07-07
  • Django中ORM外鍵和表的關(guān)系詳解

    Django中ORM外鍵和表的關(guān)系詳解

    這篇文章主要介紹了Django中ORM外鍵和表的關(guān)系詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Jmeter中JSR223設(shè)置變量方式

    Jmeter中JSR223設(shè)置變量方式

    本文主要介紹了JMeter的幾種常用變量設(shè)置方式,特別對(duì)JSR223設(shè)置變量進(jìn)行了詳細(xì)解釋,JSR223是Java規(guī)范請(qǐng)求,可以向Java平臺(tái)增添新的API和服務(wù),JSR223Sampler可以使用JSR223腳本代碼執(zhí)行創(chuàng)建/更新變量所需的示例或一些計(jì)算
    2024-10-10
  • 淺析python中的絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入

    淺析python中的絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入

    這篇文章主要是想和大家簡(jiǎn)單聊聊python中絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考下
    2023-09-09
  • K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)

    這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下
    2021-01-01
  • 詳解Python中openpyxl模塊基本用法

    詳解Python中openpyxl模塊基本用法

    這篇文章主要介紹了Python中openpyxl模塊基本用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解

    Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解

    這篇文章主要介紹了Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • 圖文講解選擇排序算法的原理及在Python中的實(shí)現(xiàn)

    圖文講解選擇排序算法的原理及在Python中的實(shí)現(xiàn)

    這篇文章主要介紹了選擇排序的原理及在Python中的實(shí)現(xiàn),選擇排序的時(shí)間復(fù)雜度為О(n²),需要的朋友可以參考下
    2016-05-05

最新評(píng)論

乌拉特中旗| 海林市| 舟曲县| 乐昌市| 庆元县| 都匀市| 安多县| 九龙城区| 如皋市| 南雄市| 宁海县| 宝丰县| 汶川县| 独山县| 潞西市| 仁寿县| 清镇市| 靖边县| 万源市| 屏南县| 正镶白旗| 西青区| 玛曲县| 遂平县| 永定县| 西乌珠穆沁旗| 朝阳县| 西藏| 九龙城区| 德保县| 灵宝市| 屯留县| 察哈| 营山县| 静乐县| 康乐县| 怀化市| 绥芬河市| 灵台县| 嘉兴市| 曲水县|