【问题标题】:Modifying files via slurm epilog script is not effective通过 slurm Epilog 脚本修改文件无效
【发布时间】:2019-11-15 06:48:41
【问题描述】:

我在 CentOS 6.9 上运行 slurm 17.11.7。我已经修改了我的 /gpfs0/export/slurm/conf/epilog 脚本。我最终想将作业资源利用率信息打印到用作每个用户作业的标准输出文件中。

在将它推广给其他用户之前,我一直在脚本末尾的条件中为自己测试它。以下是我修改后的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 $2}'`
    # 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修改了stdout文件。

我选择了计算节点 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 $2}'`
    python -c "import sys; stdout=sys.argv[1]; f=open(stdout, 'a'); f.write('sticks\n'); f.close();"  ${STDOUT}
    #echo "HELLO! ${USER}"
fi

问题:我哪里出错了?

编辑:这是在输出结束时尝试打印作业的资源利用率的上下文中的 MWE。

【问题讨论】:

  • 您的问题是结语没有运行还是运行但无法写入输出文件? /var/log/epilog.log 被修改了吗?
  • epilog 脚本肯定正在运行。从头开始的目录肯定会被创建。 node21 上的/var/log/epilog.log 未被修改。

标签: slurm


【解决方案1】:

为此,请在 epilog.log 脚本的末尾添加

# writing job statistics into job output
OUT=`scontrol show jobid ${SLURM_JOB_ID} | grep StdOut | awk 'BEGIN{FS="="}{print $2}'`
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 语句不起作用。

【讨论】:

    【解决方案2】:

    根据this page,您可以通过在输出前加上“打印”命令,从 Slurm 序言打印到标准输出。

    例如,而不是

    echo "Starting prolog"
    

    你需要做的

    echo "print Starting Prolog"
    

    不幸的是,这似乎只适用于序言,而不是结语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2021-08-19
      • 2022-06-10
      相关资源
      最近更新 更多