我想创建一个小脚本来在集群上显示 slurm 输出而无需等待。它几乎可以工作,只是我必须在另一个 shell 的同一文件夹中执行 ls (或其他磁盘访问)才能启动显示。我不明白为什么。这是脚本:
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
LOG=$(sbatch $1 | awk '{print $4}')
i=1
declare -a progress=("/" "-" "\\" "-")
while [ ! -f res_${LOG}.log ]; do
/bin/echo -n -e "Waiting for res_${LOG}.log to appear ${progress[$((${i} % 4))]} \r"
i=$((${i}+1))
sleep 1
done
echo
tail -f res_${LOG}.log
请注意,它使用给定的命令启动sbatch,然后反复检查是否出现了 slurm 日志文件,这意味着作业已启动。不幸的是,如果我不在另一个 shell 或脚本中进行文件系统访问,while 循环永远不会退出。如果我添加
ls >& /dev/null
就在 之后sleep 1,一旦出现日志文件,循环就会按预期退出。
下面的最小示例有问题。调用wait.slurm,我用./sbatch.sh wait.slurm.
#!/bin/bash
#SBATCH --output=res_%j.log
while [ 1 ];
do echo hello;
sleep 1;
done
我怀疑文件系统级别有一些奇怪的事情,但我想了解它是什么。