2

我有一个程序,当它收到 a 时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(类似于此示例),但我不需要这个繁琐的 bash 文件来处理其他任何事情。此外,sbatch --signal文档非常清楚地表明,当您想要通知封装的 bash 文件时,您需要指定signal=B:,所以我认为 bash 包装器并不是真正需要的。

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

4

1 回答 1

1

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

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

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

这些人描述了一种创建所需函数的好方法:是否可以在 bash 中检测 *which* 陷阱信号?

他们唯一没有显示的是在接收信号时实际会采取行动的功能。这是我写的 - 把它放在一个文件中,该文件可以包含在任何用户的 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
于 2020-02-24T17:50:13.960 回答