Bash重定向与管道

时间:2017-07-25 12:26:21

标签: linux bash unix redirect pipe

我有以下bash脚本:

#!/bin/bash

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM

proxy_list="${1}"
url="google.com"
pool=5
timeout=2

check_proxy() {
    local socks_proxy="${1}"
    for retry in {0..2}; do
        time_connect="$(curl ${url} --socks5 ${socks_proxy} -m${timeout} -o /dev/null -s -w %{time_connect})"
        if [ $? -eq 0 ]; then
            echo "${socks_proxy} (${time_connect}s) retries=${retry}"
            break
        fi
    done
}

while read proxy; do
    while true; do
        if [ "$(jobs -rp | wc -l)" -lt "${pool}" ]; then
            check_proxy "${proxy}" &
            break
        fi
        wait -n
    done
done < "${proxy_list:-/dev/stdin}"

wait

脚本将使用文件名(${1})作为输入,如果没有提供位置参数,则使用stdin。

(PIPE)如果我按如下方式运行脚本并尝试在运行时使用CTRL + C将其终止:

cut -f1 -d' ' data/socks_tested_sorted.list | ./curl_socks_tester.sh

我收到此错误并且脚本继续运行:

  

./ curl_socks_tester.sh:line 1:kill:( - 21325) - 没有这样的过程

(REDIRECT)或者像这样运行命令并使用CTRL + C终止脚本:

./curl_socks_tester.sh <(cut -f1 -d' ' data/socks_tested_sorted.list)

脚本停止,我收到以下消息:

  

^ CTerminated

为什么陷阱能够在使用重定向时终止所有子进程但是它使用管道失败了?

1 个答案:

答案 0 :(得分:1)

bash运行作业的方式,管道中的第一个链接成为组长(因为您应该能够使用ps验证)。

因此,在:

cut -f1 -d' ' data/socks_tested_sorted.list | ./curl_socks_tester.sh

./curl_socks_tester.sh 小组组长,因此kill -- -$$无效。

如果您可以确定shell脚本是其进程组的领导者,则只能在脚本中使用kill -- -$$