gpt4 book ai didi

linux - `kill "$! "` 在 FOR 循环时不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:14 25 4
gpt4 key购买 nike

如果涉及 FOR 循环,kill "$!" 命令似乎不起作用。

下面的脚本触发 2 个函数,main 和 progress,同时运行。主要完成后,进度将被终止:

#!/bin/bash

functionA() { # MAIN
sleep 15
}

functionB() { #PROGRESS
local A=${1:-30}
local B=${2:-1}
local C=${3:-"X"}
local D=${4:-"*"}
local i

while true
do
echo -en "["
for i in $(seq 1 "$A")
do
echo -en "$C"
done

echo -en "]\0015["
for i in $(seq 1 "$A")
do
echo -en "$D"
sleep "${B}"
done
echo
done
}

functionB 10 &
progress_PID="$!"

functionA

kill "$progress_PID" # Stop the progress bar
echo "Finished"

效果很好。

但是,当我将它应该使用的真实代码放入 functionA 时,其中包含一个 FOR 循环,进度永远不会结束,尽管主要功能早就完成了:

functionA() {
for IP in "${book[@]}"; do
ssh user@"$IP" "sleep 15" > /dev/null 2>&1 &
done
wait
}

我尝试添加 echo "$!" 来捕获“$!”被抓得很好。是的,进程 ID 是常量,但我在 shell 中看不到它,因为它可能只存在于子 shell 中。

为什么 progress_PID="$!" 没有被杀死,尽管它显然已经被破坏了?

(请说明解决方法)

最佳答案

我怀疑您的 wait 也在等待后台进度条。 try catch 后台 ssh 实例的特定 pid,并专门等待它们:

functionA() {
local a=()

for IP in "${book[@]}"; do
ssh user@"$IP" "sleep 15" > /dev/null 2>&1 &
a+=($!)
done

wait "${a[@]}"
}

这会将后台 sshes 的 pid 放入一个数组中,然后等待数组的成员而不是“所有后台的”,即 wait' s 默认行为。 bash 手册页指出:

If n̲ is not given, all currently active child processes are waited for

注意:未经测试。可能含有坚果。

关于linux - `kill "$! "` 在 FOR 循环时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52055535/

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