【问题标题】:trap INT doesn't work when executing a virtualenv or pip in a bash script在 bash 脚本中执行 virtualenv 或 pip 时陷阱 INT 不起作用
【发布时间】:2019-08-24 09:32:17
【问题描述】:

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

【问题讨论】:

  • 获取安装包的管理员配置首选项的正确方法是通过Debconf。

标签: linux bash virtualenv


【解决方案1】:

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

#! /usr/bin/env bash
trap 'die' INT TERM
trap 'kill -PIPE 0' EXIT

die() {
    echo "error: $*" >&2
    exit 255
}

<cmd> || die '<cmd> failed'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多