我有以下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
为什么陷阱能够在使用重定向时终止所有子进程但是它使用管道失败了?
答案 0 :(得分:1)
bash运行作业的方式,管道中的第一个链接成为组长(因为您应该能够使用ps
验证)。
因此,在:
cut -f1 -d' ' data/socks_tested_sorted.list | ./curl_socks_tester.sh
./curl_socks_tester.sh
不小组组长,因此kill -- -$$
无效。
如果您可以确定shell脚本是其进程组的领导者,则只能在脚本中使用kill -- -$$
。