我有一个带有post_install脚本的deb包,它应该创建一个python虚拟环境并在其上安装需求。 问题是当用户按ctrl+c
、virtualenv
或pip
命令中断、打印错误消息并执行下一个命令而不是运行陷阱处理程序时。
我试图在后台运行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'