Windows计划任务调度Python脚本写NFS远程目录异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows计划任务调度Python脚本写NFS远程目录异常相关的知识,希望对你有一定的参考价值。

问题描述

某项目场景,一台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: fidxx_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:appsxx_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=<.ImportantPIDxx_pid.txt
tasklist /FI "pid eq %processID%" | find /C "python.exe">.ImportantPIDxx_tmp.txt
::xx_tmp.txt 状态文件, 上面的筛选返回0或1
set /p aliveFlag=<.ImportantPIDxx_tmp.txt
echo %aliveFlag%
::del /F .ImportantPIDxx_tmp.txt

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

以上是关于Windows计划任务调度Python脚本写NFS远程目录异常的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 任务调度程序在虚拟环境中运行 python 脚本

windows 计划任务执行python脚本

使用 Windows 任务调度程序和 xampp 服务器运行带有 curl 的 php 脚本

windows 10 如何设定计划任务自动执行 python 脚本?

Python全栈_Day10_nfs和计划任务

使用 PHP 和 Windows 任务计划程序在退出时重试(1)