Bash 使用flock复制文件

Bash 使用flock复制文件,bash,slurm,flock,Bash,Slurm,Flock,我在slurm上运行数组作业,因此每个作业都需要将一个文件从本地目录复制到临时目录。此cp不应同时发生 这是我想出的代码: mydirectory=mydb LOCKFILE_1=${mydirectory}.lock set -e ( flock -w 3600 200 # Wait for the lockfile for max. 1 hour (3600 s), to not block the queue forever in case of dead lock files.

我在slurm上运行数组作业,因此每个作业都需要将一个文件从本地目录复制到临时目录。此
cp
不应同时发生

这是我想出的代码:

mydirectory=mydb
LOCKFILE_1=${mydirectory}.lock
set -e
(
    flock -w 3600 200 # Wait for the lockfile for max. 1 hour (3600 s), to not block the queue forever in case of dead lock files.
    cp -r ${mydirectory} $TMPDIR/newdestinationdirectory
) 200>$LOCKFILE_1
set +e
这段代码做得对吗? 或者我需要什么

rm -f $LOCKFILE_1

要再次删除锁定文件?

如果我理解正确,您希望限制文件系统和网络上的负载。斯劳姆的命令适用于这种情况。您只能复制单个文件,因此在广播到所有节点之前,您应该对目录进行tar:

tar cf ${mydirectory}.tar $mydirectory
sbcast ${mydirectory}.tar $TMPDIR/
srun -n ${SLURM_JOB_NUM_NODES} --ntasks-per-node=1 "tar xf ${mydirectory}.tar -C $TMPDIR/"

这只能在作业分配内完成(例如,在作业脚本内)

如果我理解正确,您希望限制文件系统和网络上的负载。斯劳姆的命令适用于这种情况。您只能复制单个文件,因此在广播到所有节点之前,您应该对目录进行tar:

tar cf ${mydirectory}.tar $mydirectory
sbcast ${mydirectory}.tar $TMPDIR/
srun -n ${SLURM_JOB_NUM_NODES} --ntasks-per-node=1 "tar xf ${mydirectory}.tar -C $TMPDIR/"

这只能在作业分配内完成(例如,在作业脚本内)

此cp不应同时发生
。为什么?你可以同时阅读。您不能同时读写-但此处没有显示写操作,因此,在每个作业的目标都是唯一的之前,只需并行复制。系统管理员可能会生气(他过去这样做过…
此cp不应同时发生
)。为什么?你可以同时阅读。您不能同时读写-但此处没有显示写操作,因此,在每个作业的目标都是唯一的之前,只需并行复制。系统管理员可能会发疯(他过去这样做过…),这适用于所有当前活动的slurm作业,对吗?它必须在作业脚本或作业分配中运行。所以不适用于已经运行的作业。这适用于所有当前活动的slurm作业,对吗?它必须在作业脚本或作业分配中运行。因此,对于已经在运行的作业,情况并非如此。