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