1. 程式人生 > >Windows計劃任務調度Python腳本寫NFS遠程目錄異常

Windows計劃任務調度Python腳本寫NFS遠程目錄異常

pytho work important 註冊表 targe 映射 file 任務調度 exists

問題描述

某項目場景,一臺Windows服務器運行Python腳本從互聯網采集數據,並將數據文件拷貝至內網的NFS。Python版本為2.7,Windows版本是2008 R2(6.1.7600.2.0.0.274.10)。Windows掛載遠程NFS目錄後(映射網絡驅動器至本地Z盤),使用Windows資源管理器打開遠程目錄,拷貝文件等操作無問題。同時,單獨在cmd下執行python xx_data_collect.py ,數據也能正常拷貝至遠程目錄。使用Windows計劃任務5分鐘一次調度xx_data_collect.py腳本,腳本已經調度,但數據無法拷貝,在執行os.path.exists(targetPath)的時候,拋出“Target file path: Z:\rfid\xx_data\目錄不存在”的異常。此Windows運行5類數據采集腳本,腳本結構、功能一致,4類數據(頻率5分鐘)的計劃任務調度無法識別NFS目錄,1類數據(traffic,頻率1月)的正常。

問題定位與驗證

  1. 計劃任務屬性:檢查計劃任務屬性,復制正常的1類數據(traffic)計劃任務,修改調度的Python腳本,再次執行還是報目錄不存在。
  2. NFS Client:檢查註冊表,未發現問題
  3. 計劃任務調度BAT:嘗試寫一個bat,執行xx_data_collect.py,再由計劃任務調度bat。bat內容加入 "NET USE z://192.168.1.x/data/PERSISTENT:YES"。再次執行還是報目錄不存在。
  4. NFS目錄的問題:將Target目錄配置成操作系統本地目錄,計劃任務調度執行拷貝正常。將Target目錄配置成其他的NFS目錄,再次執行還是報目錄不存在。
    到目前為止,還是未找到真正的問題,只能想其他的方式解決。

    解決方法

    將計劃任務調度方式換掉,編寫一個bat腳本,放入開機自啟動。說明:receive腳本負責從互聯網獲取數據,屬於常駐內存,collect腳本負責將數據文件拷貝至NFS對應目錄。內容如下:

@echo off
::檢測時間間隔,單位:秒
set _interval=300
set _processName="xx_data_receive"
::需要守護的進程啟動命令
set _processCmd=python E:\apps\xx_data_collect.py
::需要守護的進程預估啟動完畢所需時間,單位:秒
set _processTimeout=10

:LOOP
echo "xx_data_receive program keeper is working!!!!!!!"
echo %_processCmd%
::需要守護的進程ID, xx_data_receive程序啟動會寫入pid到文件
set /p processID=<.\ImportantPID\xx_pid.txt
tasklist /FI "pid eq %processID%" | find /C "python.exe">.\ImportantPID\xx_tmp.txt
::xx_tmp.txt 狀態文件, 上面的篩選返回0或1
set /p aliveFlag=<.\ImportantPID\xx_tmp.txt
echo %aliveFlag%
::del /F .\ImportantPID\xx_tmp.txt

if "%aliveFlag%" == "0" (
start %_processCmd% | echo 啟動 %_processName% 於 %time%
choice /D y /t %_processTimeout% > nul
)
goto LOOP

Windows計劃任務調度Python腳本寫NFS遠程目錄異常