trap INT 在 bash 脚本中执行虚拟环境或 pip 时不起作用



我有一个带有post_install脚本的deb包,它应该创建一个python虚拟环境并在其上安装需求。 问题是当用户按ctrl+cvirtualenvpip命令中断、打印错误消息并执行下一个命令而不是运行陷阱处理程序时。

我试图在后台运行virtualenv获取其 PID 并等待它执行,但它不起作用。 像这样:

function sig_int(){
echo "exiting..."
kill -SIGINT $PID
exit 255
}
virtualenv -p python3 <somewhere> &
PID=$!
trap sig_int INT
wait $PID

脚本是这样的:

function sig_int(){
echo "exiting..."
# do some cleanup
exit 255
}
trap sig_int INT
virtualenv -p python3 <somewhere>
. <somewhere>/bin/activate
pip3 install req1
pip3 install req2
read -p "> Please enter username: " user
read -s -p "> Please enter password: " pass
...

ctrl+c当 pip3 install 或 virtualenv 正在运行时,按ctrl+c只会中断 pip3 或 virtualenv,并在读取块脚本中按ctrl+c时继续执行。

我想,这是一个由于生成后台作业而导致的问题,您也需要杀死所有作业。我通过执行以下操作解决了类似的问题,但请注意,这也会杀死父进程。

#! /usr/bin/env bash
trap 'die' INT TERM
trap 'kill -PIPE 0' EXIT
die() {
echo "error: $*" >&2
exit 255
}
<cmd> || die '<cmd> failed'

最新更新