slurm - 如何将超时信号发送到 sbatch 中的包装命令?

标签 slurm sbatch

我有一个程序,当它收到 SIGUSR1 时, 写一些输出并退出。我正在尝试获取 sbatch在超时之前通知这个程序。

我使用以下方式对程序进行排队:

sbatch -t 06:00:00 --signal=USR1 ... --wrap my_program

但是my_program永远接收不到信号。我试过在程序运行时发送信号:scancel -s USR1 <JOBID> , 但没有任何成功。我也试过scancel --full , 但它会杀死包装器和 my_program没有通知。

一个选择是编写一个包装 my_program 并捕获信号的 bash 文件,将其转发到 my_program (类似于 this example ),但我不需要这个笨重的 bash 文件来做任何其他事情。另外,sbatch --signal文档非常清楚地说,当你想通知封装的 bash 文件时,你需要指定 signal=B: ,所以我认为 bash 包装器并不是真正必要的。

那么,有没有办法向使用 sbatch --wrap 排队的程序发送 SIGUSR1 信号? ?

最佳答案

您的命令将 USR1 发送到由 --wrap 创建的 shell。但是,如果您希望捕获和处理信号,您将需要编写 shell 函数来处理信号,这对于 --wrap 命令来说可能太多了。

这些人正在这样做,但您无法查看他们的 setup.sh 脚本以了解他们正在定义什么。 https://docs.nersc.gov/jobs/examples/#annotated-example-automated-variable-time-jobs

注意他们使用“.”在同一进程中运行 setup.sh 中的代码,而不是生成子 shell。你需要那个。

这些人描述了一种创建您需要的函数的好方法:Is it possible to detect *which* trap signal in bash?

唯一没有显示的是在接收信号时实际采取行动的功能。这是我写的,它是这样做的——把它放在一个可以从任何用户的 sbatch 提交脚本中包含的文件中,并向他们展示如何使用它和 --signal 选项:

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        echo "setting trap for $sig"
        trap "$func $sig" "$sig"
    done
}

func_trap () {
    echo "called with sig $1"
    case $1 in
        USR1)
            echo "caught SIGUSR1, making ABORT file"
            date
            cd $WORKDIR
            touch ABORT
            ls -l ABORT
        ;;
        *) echo "something else" ;;
    esac
}

trap_with_arg func_trap USR1 USR2

关于slurm - 如何将超时信号发送到 sbatch 中的包装命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55170629/

相关文章:

linux - 如何执行 matlab 函数并将输出保存在 linux 中的新文件中?

python - 在 python 脚本中使用 slurm 创建作业,迭代列表中的项目

linux - slurm SBATCH - 多个节点,相同的 SLURMD_NODENAME

SLURM 错误 - sbatch HS8_main.sbatch sbatch : error: Unable to open file HS8_main. sbatch

arrays - 相同脚本但具有不同输入参数的 SLURM sbatch 作业数组并行运行

slurm - 如何配置slurm通知邮件的内容?

Emacs在SLURM交互节点上出现乱码

mpi - SLURM:如何在同一计算节点或不同节点上并行运行不同的可执行文件?

cluster-computing - 如何将作业提交到 SLURM 中节点列表中的任何 [子集] 节点?

partition - 有没有办法将 SLURM 分区中的某些节点设置为优先于其他节点?