通过 slurm epilog 脚本修改文件无效
Modifying files via slurm epilog script is not effective
我在 CentOS 6.9 运行ning slurm 17.11.7。我修改了 /gpfs0/export/slurm/conf/epilog
脚本。我最终想将作业资源利用信息打印到用于每个用户作业的 stdout 文件中。
在将它推广给其他用户之前,我一直在脚本末尾的条件下为自己测试它。下面是我修改后的 epilog
脚本:
#!/bin/bash
# Clear out TMPDIR on the shared file system after job completes
exec >> /var/log/epilog.log
exec 2>> /var/log/epilog.log
if [ -z $SLURM_JOB_ID ]
then
echo -e " This script should be executed from slurm."
exit 1
fi
TMPDIR="/gpfs0/scratch/${SLURM_JOB_ID}"
rm -rf $TMPDIR
### My additions to the existing script ###
if [ "$USER" == "myuserid" ]
then
STDOUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
# Regular stdout/stderr is not respected, must use python.
python -c "import sys; stdout=sys.argv[1]; f=open(stdout, 'a'); f.write('sticks\n'); f.close();" ${STDOUT}
fi
exit 0
从 slurm.conf user manual 的 Prolog 和 Epilog 部分看来 stdout/stderr 没有得到尊重。因此我用 python.
修改标准输出文件
我选择了计算节点 node21 来 运行 这项工作,所以我登录到 node21 并尝试了一些方法来让它注意到我对 epilog 脚本的更改。
重新配置 slurmd
:
sudo scontrol reconfigure
重启 slurm 守护进程:
sudo service slurm stop
sudo service slurm start
当我提交作业时,这两个似乎都没有得到对 epilog 脚本的更改。当在批处理脚本中放置相同的条件时,它 运行 完美无缺:
#!/bin/bash
#SBATCH --nodelist=node21
echo "Hello you!"
echo $HOSTNAME
if [ "$USER" == "myuserid" ]
then
STDOUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
python -c "import sys; stdout=sys.argv[1]; f=open(stdout, 'a'); f.write('sticks\n'); f.close();" ${STDOUT}
#echo "HELLO! ${USER}"
fi
问题:我哪里出错了?
编辑:这是一个 MWE,它来自试图在输出末尾打印作业的资源利用率的上下文。
要得到这个,请在 epilog.log
脚本的末尾附加
# writing job statistics into job output
OUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
echo -e "sticks" >> ${OUT} 2>&1
无需重新启动 slurm 守护程序。可以向其中添加其他命令以获得资源利用率,例如
sleep 5s ### Sleep to give chance for job to be written to slurm database for job statistics.
sacct --units M --format=jobid,user%5,state%7,CPUTime,ExitCode%4,MaxRSS,NodeList,Partition,ReqTRES%25,Submit,Start,End,Elapsed -j $SLURM_JOBID >> $OUT 2>&1
基本上,您仍然可以使用 >>
附加输出文件。显然,我没有想到常规输出重定向仍然有效。目前还不清楚为什么 python 对此的声明不起作用。
根据 this page,您可以通过在输出前加上 'print' 命令从 Slurm prolog 打印到标准输出。
例如,而不是
echo "Starting prolog"
你需要做的
echo "print Starting Prolog"
不幸的是,这似乎只对序言有效,对结尾无效。
我在 CentOS 6.9 运行ning slurm 17.11.7。我修改了 /gpfs0/export/slurm/conf/epilog
脚本。我最终想将作业资源利用信息打印到用于每个用户作业的 stdout 文件中。
在将它推广给其他用户之前,我一直在脚本末尾的条件下为自己测试它。下面是我修改后的 epilog
脚本:
#!/bin/bash
# Clear out TMPDIR on the shared file system after job completes
exec >> /var/log/epilog.log
exec 2>> /var/log/epilog.log
if [ -z $SLURM_JOB_ID ]
then
echo -e " This script should be executed from slurm."
exit 1
fi
TMPDIR="/gpfs0/scratch/${SLURM_JOB_ID}"
rm -rf $TMPDIR
### My additions to the existing script ###
if [ "$USER" == "myuserid" ]
then
STDOUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
# Regular stdout/stderr is not respected, must use python.
python -c "import sys; stdout=sys.argv[1]; f=open(stdout, 'a'); f.write('sticks\n'); f.close();" ${STDOUT}
fi
exit 0
从 slurm.conf user manual 的 Prolog 和 Epilog 部分看来 stdout/stderr 没有得到尊重。因此我用 python.
修改标准输出文件我选择了计算节点 node21 来 运行 这项工作,所以我登录到 node21 并尝试了一些方法来让它注意到我对 epilog 脚本的更改。
重新配置 slurmd
:
sudo scontrol reconfigure
重启 slurm 守护进程:
sudo service slurm stop
sudo service slurm start
当我提交作业时,这两个似乎都没有得到对 epilog 脚本的更改。当在批处理脚本中放置相同的条件时,它 运行 完美无缺:
#!/bin/bash
#SBATCH --nodelist=node21
echo "Hello you!"
echo $HOSTNAME
if [ "$USER" == "myuserid" ]
then
STDOUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
python -c "import sys; stdout=sys.argv[1]; f=open(stdout, 'a'); f.write('sticks\n'); f.close();" ${STDOUT}
#echo "HELLO! ${USER}"
fi
问题:我哪里出错了?
编辑:这是一个 MWE,它来自试图在输出末尾打印作业的资源利用率的上下文。
要得到这个,请在 epilog.log
脚本的末尾附加
# writing job statistics into job output
OUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print }'`
echo -e "sticks" >> ${OUT} 2>&1
无需重新启动 slurm 守护程序。可以向其中添加其他命令以获得资源利用率,例如
sleep 5s ### Sleep to give chance for job to be written to slurm database for job statistics.
sacct --units M --format=jobid,user%5,state%7,CPUTime,ExitCode%4,MaxRSS,NodeList,Partition,ReqTRES%25,Submit,Start,End,Elapsed -j $SLURM_JOBID >> $OUT 2>&1
基本上,您仍然可以使用 >>
附加输出文件。显然,我没有想到常规输出重定向仍然有效。目前还不清楚为什么 python 对此的声明不起作用。
根据 this page,您可以通过在输出前加上 'print' 命令从 Slurm prolog 打印到标准输出。
例如,而不是
echo "Starting prolog"
你需要做的
echo "print Starting Prolog"
不幸的是,这似乎只对序言有效,对结尾无效。