如何在单实例情况下杀死所有并行 Bash/Linux 任务

use*_*732 0 linux parallel-processing bash function kill-process

我有一个并行的 Bash 函数:

#!/bin/bash

touch out.txt
vals=$(seq 1 1 20)
task(){
    echo $1 >> out.txt
    x=$(wc -l out.txt | cut -d' ' -f 1) #read current length of file
    if [ $x > 5 ]
    then
    echo $x #NB prints even if <5!!
    KILL_ALL_JOBS_HERE_ON_IF_THEN_CONDITION
    fi
}

export -f task

echo $vals | xargs -P2 -I'{}' -d' ' bash -c 'task "$1"' bash {} 
Run Code Online (Sandbox Code Playgroud)

该函数开始将二十个值回显到单个文本文件。但是,当文件长度超过 5 行时,我希望所有进程/实例停止并且不再处理变量中的值。我该怎么做?(注意一个小问题,if-then 语句也很奇怪 - 它会回显处理后的值 $x,无论它是否 >5)。

Kam*_*Cuk 5

[ $x > 5 ]

是相同的:

[ $x ] > 5 
Run Code Online (Sandbox Code Playgroud)

它将命令的输出重定向[到名为5. 就像echo > 5

你要:

[ "$x" -gt 5 ]
Run Code Online (Sandbox Code Playgroud)
 KILL_ALL_JOBS_HERE_ON_IF_THEN_CONDITION
Run Code Online (Sandbox Code Playgroud)

如果您使用 GNU xargs,它们来自 man xargs:

如果该命令的任何调用以状态 255 退出,xargs 将立即停止,而不读取任何进一步的输入。发生这种情况时,会在 stderr 上发出错误消息。

只是exit 255