【问题标题】:How can I send a timeout signal to a wrapped command in sbatch?如何向 sbatch 中的包装命令发送超时信号?
【发布时间】:2019-03-14 19:30:40
【问题描述】:

我有一个程序,当它收到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 信号?

【问题讨论】:

  • my_program 是否正在启动作业步骤?你为什么不使用signal=B:USR1--wrap是创建一次性bash脚本的简写,所以还是有shell进程的。

标签: slurm sbatch


【解决方案1】:

您的命令正在将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多