如何将超时信号发送到Sbatch中的包装命令



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

i使用:

加入程序
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(类似于此示例),但是我不需要此繁琐的bash文件。另外,sbatch --signal文档非常清楚地表明,当您要通知包裹的bash文件时,您需要指定signal=B:,所以我相信Bash包装器并不是真正必要的。

那么,是否有一种方法可以将Sigusr1信号发送到使用sbatch --wrap加入的程序?

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

这些人正在这样做,但是您看不到他们的设置。SH脚本以查看他们的定义。https://docs.nersc.gov/jobs/examples/#annotated-example-automated-variable-time-jobs

注意他们使用"。在相同的过程中以setup.sh运行代码,而不是覆盖子壳。您需要那个。

这些人描述了创建您需要的功能的好方法:是否可以检测 * bash中的 *陷阱信号?

他们唯一不显示的东西有一个实际上会采取行动接收信号的功能。这是我写的东西 - 将其放入可以从任何用户的sbatch提交脚本中包含的文件中,并向他们展示如何使用它以及 - 信号选项:

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

最新更新