gpt4 book ai didi

linux - Bash 重定向与管道

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:46 27 4
gpt4 key购买 nike

我有以下 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}) 作为输入,如果未提供位置参数,则使用标准输入。

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

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

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

./curl_socks_tester.sh: line 1: kill: (-21325) - No such process

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

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

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

^CTerminated

为什么陷阱能够在使用重定向时杀死所有子进程,但使用管道却失败了?

最佳答案

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

因此,在:

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

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

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

关于linux - Bash 重定向与管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com