我有一个程序,当它收到 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 信号? ?
最佳答案
您的命令是将 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
关于slurm - 如何将超时信号发送到 sbatch 中的包装命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55170629/