Python 脚本可以从终端运行,但在调度程序中无法写入外部驱动器

Python 脚本可以从终端运行,但在调度程序中无法写入外部驱动器

我正在尝试使用 Python 脚本从 Linux 中的外部磁盘读取/写入,效果很好。当我使用作业调度程序执行 Python 程序时,问题就出现了。

我在 Rocks Cluster 上运行所有这些(Linux 版本是 CentOS 6.5),作业调度程序是 Sun Grid Engine (SGE)。我已安装外部磁盘,以便所有用户都具有读写权限。 fstab 中用于安装磁盘的行是:

/dev/sdb1 /mnt/drive   ntfs-3g    auto,users,permissions   0   0

我给你举一个简单的例子,但失败了。以下Python程序(simple_write.py):

#!/usr/bin/env python2.7

f = open('/mnt/drive/sean/test.txt', 'w')
f.write('Writing in the file')
f.close()

如果在终端中执行,则运行良好,如下所示:

python2.7 /home/sean/simple_write.py

如果我然后创建一个小 bash 脚本 (job_submit.sh) 来提交给调度程序 (SGE),如下所示:

#!/bin/bash
#
#$ -cwd
#$ -j y
#$ -S /bin/bash
python2.7 /home/sean/simple_write.py

并从终端提交:

qsub job_submit.sh

然后我收到以下(Python)错误:

IOError: [Errno 2] No such file or directory: '/mnt/drive/sean/test.txt'

该问题可以通过以下方法解决:(a) 直接从终端运行 simple_write.py 或 (b) 将 simple_write.py 中的写入位置更改为本地磁盘上的某个位置,而不是外部磁盘(读取文件时也会发生类似的错误) /目录而不是写入)。因此,似乎调度程序与已安装的驱动器不能很好地配合,这肯定是一些问题,但我不知道接下来要尝试什么。任何帮助将不胜感激。

答案1

集群作业调度程序(例如Sun Grid Engine、HTCondor、SLURM 等)可以在主控或作业提交主机之外的其他系统上运行作业。仅在主控或作业提交主机上公开的文件系统因此可能对集群中的作业运行系统不可用。作业调度程序可能有日志或标志来指示作业正在哪个系统上运行,或者可以通过提交执行作业lsdf在其运行的任何系统上检查可用的文件系统(不过,请注意,此类作业可能会在 I/ O 如果存在不可用的 NFS 硬挂载,在这种情况下,作业将根据集群软件卡住)来确定目录或哪些文件系统是否可用。如果文件系统不可用,则需要通过 NFS(或其他一些网络文件系统)使其可用。另一种选择可能是让作业调度程序软件将必要的文件复制到作业将在其上运行的主机,尽管如何执行此操作将根据所使用的作业调度程序而有所不同(并且可能需要将任何输出文件复制到其他地方)一旦作业完成)。

是否复制或依赖网络文件系统取决于数据量,少量数据可以轻松复制,而作业将翻阅的大量数据存储库则有利于使用网络文件系统。另请注意,大量客户端很容易使 NFS 服务器过载;输出(尤其是临时输出)可能需要写入作业运行系统上的本地文件系统,并且仅将结果写入 NFS 服务器。

相关内容