在bash脚本中执行virtualenv或pip时,陷阱INT不起作用

时间:2019-08-24 09:32:17

标签: linux bash virtualenv

我有一个带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退出时继续执行。

1 个答案:

答案 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'