我有一个带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
退出时继续执行。
答案 0 :(得分:0)
我想这是由于产生了后台作业而引起的问题,您还需要杀死所有这些作业。通过执行以下操作,我解决了一个类似的问题,但请注意,这也会杀死父母的过程。
#! /usr/bin/env bash
trap 'die' INT TERM
trap 'kill -PIPE 0' EXIT
die() {
echo "error: $*" >&2
exit 255
}
<cmd> || die '<cmd> failed'