看起来xargs从stdin读取输入行,即使它已经运行了它可以运行的最大进程数。
以下是一个例子:
#!/bin/bash
function xTrigger()
{
for ii in `seq 1 100`; do echo $ii; sleep 2; done
}
function xRunner()
{
sleep 10;
echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"
开始上述过程后20秒,我killall xTrigger
,但是xargs已经缓存了所有xTrigger打印的内容,因此xRunner继续打印1..10。我想要的是它只打印1,2
无论如何,我们可以改变这种行为,并且只有当它想要启动一个新命令时才让xargs从stdin中读取,这样xTrigger会在echo语句中等待,直到xargs从中读取它为止?我的标准输入具有非常动态的内容,因此这将非常有用。
试图坚持xargs只是因为它会稳定和优雅。只有在使用xargs没有简单的方法时才想编写额外的代码。
感谢您的帮助!
答案 0 :(得分:0)
你不必杀死xTrigger()的Bash PID吗?
bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>
答案 1 :(得分:0)
在我的系统上,如果正在运行的其中一个作业以非零返回码退出,xargs将默认停止。因此,您应该将信号发送到运行XRunner的bash pid。
答案 2 :(得分:0)
只有在没有“bash -c xRunner”作业运行时,才能使xTrigger生成下一个触发器。现在很棒:
#!/bin/bash
function xTrigger()
{
for ii in `seq 1 100`; do
echo $ii;
while [[ $(psgrep xRunner|grep -v xargs|wc -l) -ge 1 ]]; do
sleep 2;
done
done
}
function xRunner()
{
sleep 10;
echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"