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

问题描述 投票:1回答:1

我有一个程序,当它接收到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排队的程序?

slurm sbatch
1个回答
0
投票

您的命令将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
© www.soinside.com 2019 - 2024. All rights reserved.