如何在sbatch中向包装的命令发送超时信号?

时间:2019-03-14 19:30:40

标签: slurm sbatch

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

我使用以下方法使程序入队

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

但是my_program从未收到信号。我尝试在程序运行时发送信号,并带有scancel -s USR1 <JOBID>,但没有成功。我也尝试过scancel --full,但是它杀死了包装器,my_program没有得到通知。

一个选择是编写一个bash文件,该文件包装my_program并捕获信号,然后将其转发到my_program(类似于this example),但是我不需要其他任何麻烦的bash文件。另外,sbatch --signal文档非常清楚地指出,当您要通知包围的bash文件时,需要指定signal=B:,因此我认为bash包装器并不是必需的。

那么,有没有一种方法可以将SIGUSR1信号发送到使用sbatch --wrap入队的程序?

1 个答案:

答案 0 :(得分:0)

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

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

请注意,他们使用“。”在相同的过程中运行setup.sh中的代码,而不是散布子外壳程序。你需要那个。

这些人描述了一种创建所需功能的好方法: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