【问题标题】:Kill a process generated by for loop after certain time一定时间后杀死for循环生成的进程
【发布时间】:2013-04-04 14:26:26
【问题描述】:

我有一些代码往往会随机挂在它的“for 循环”中。我正在寻找一种解决方案,如果 ssh 会话的 PID 存在 5 秒,它将自动终止它。我现在手动终止挂起的进程,但我想把它放在 cron 中,这样自动 PID 终止会很棒。

for host in `cat $WORKDIR/linux_hosts.txt $WORKDIR/aix_hosts.txt`
do
    ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t $host "cat /etc/passwd" >> $FILEDIR/$host
done

感谢您的帮助!

【问题讨论】:

    标签: bash for-loop ssh


    【解决方案1】:

    在后台运行所有 ssh 进程,然后等待 5 秒。一旦sleep 返回,使用jobs -p 获取仍在运行的任何后台作业的进程ID,并终止它们。

    cat "$WORKDIR"/{linux_hosts.txt,aix_hosts.txt} | while read host; do
        ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t "$host" "cat /etc/passwd" >> "$FILEDIR/$host" &
    done
    sleep 5
    kill $(jobs -p) 2>/dev/null
    

    【讨论】:

    • 我明白你在说什么。我也许可以对其进行微调以准确杀死我想要的过程。我的很多问题只是不知道如何将这些东西组合在一起。我会看看它有什么作用。谢谢!
    • 在进一步研究之后,看起来它实际上会在每次循环时休眠 5 秒。这将大大延长脚本运行的时间,因为它循环了 400 多次。如果正常工作,一次循环通常会在 1-2 秒内完成。
    • 啊,所以运行 all ssh,并在 5 秒后杀死所有仍在运行的。我会更新的。
    • 哇。我很确定它做到了!更不用说在后台运行也难以置信地加快了脚本的执行速度。感谢您的帮助!
    【解决方案2】:

    使用timeout:

    for host in `cat $WORKDIR/linux_hosts.txt $WORKDIR/aix_hosts.txt`
    do
        timeout 5s ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t $host \
                       "cat /etc/passwd" >> $FILEDIR/$host
    done
    

    【讨论】:

    • 一旦超时到期,无论该确切进程是否正在运行,它都会开始抛出 tcsetattr: Interrupted system call 消息。奇怪的是,单独运行它很好,但在“for循环”内它坏了。感谢您的建议!
    【解决方案3】:

    这将找到并杀死所有超过 5 分钟的 ssh 进程。

    cd /proc
    kill $(find $(pidof ssh) -maxdepth 0 -mmin +5)
    

    【讨论】:

    • 我需要在 5 分钟内杀死挂起的处理程序。我也不希望它杀死每个 ssh 进程,因为它也会杀死这个脚本之外的任何 ssh 会话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多