我有一个程序,当它收到SIGUSR1
时,它会写一些输出并退出。我正在尝试让sbatch
在超时之前通知此程序。
我使用以下方法使程序入队
sbatch -t 06:00:00 --signal=USR1 ... --wrap my_program
但是my_program
从未收到信号。我尝试在程序运行时发送信号,并带有scancel -s USR1 <JOBID>
,但没有成功。我也尝试过scancel --full
,但是它杀死了包装器,my_program
没有得到通知。
一个选择是编写一个bash文件,该文件包装my_program并捕获信号,然后将其转发到my_program
(类似于this example),但是我不需要其他任何麻烦的bash文件。另外,sbatch --signal
文档非常清楚地指出,当您要通知包围的bash文件时,需要指定signal=B:
,因此我认为bash包装器并不是必需的。
那么,有没有一种方法可以将SIGUSR1信号发送到使用sbatch --wrap
入队的程序?
答案 0 :(得分:0)
您的命令 将USR1发送到--wrap创建的shell。但是,如果您希望捕获和处理信号,则需要编写shell函数来处理信号,这对于--wrap命令来说可能太多了。
这些人正在这样做,但是您无法查看他们的setup.sh脚本来查看他们的定义。 https://docs.nersc.gov/jobs/examples/#annotated-example-automated-variable-time-jobs
请注意,他们使用“。”在相同的过程中运行setup.sh中的代码,而不是散布子外壳程序。你需要那个。
这些人描述了一种创建所需功能的好方法: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