gpt4 book ai didi

bash - 从 bash 中的文件维护一定数量的并发作业 w/args

转载 作者:行者123 更新时间:2023-11-29 09:47:30 26 4
gpt4 key购买 nike

我在网上找到了这个脚本,我不知道在 bash 中工作太多太奇怪了但是..

这是我的脚本:

CONTOR=0
for i in `cat targets`
do
CONTOR=`ps aux | grep -c php`

while [ $CONTOR -ge 250 ];do
CONTOR=`ps aux | grep -c php`
sleep 0.1
done

if [ $CONTOR -le 250 ]; then
php b $i > /dev/null &
fi

done

我的目标是 url,b php 文件是一个将一些链接保存到文件中的爬虫。问题是线程的最大数量是 50-60,这是因为爬虫完成得非常快,bash 脚本代码没有时间打开我所有的 250 个线程。是否有机会做一些事情来打开所有线程 (250)?每个 ps -aux 进程可以运行多个线程吗?正确知道他似乎在执行 ps -aux 后打开了 1 个线程。

最佳答案

首先:Bash 没有任何多线程支持。 foo & 启动一个单独的进程,而不是一个线程。

其次:启动 ps 来检查 child 既容易出现误报(将不相关的 php 调用视为当前进程中的作业),而且效率极低如果在循环中完成(因为每次调用都涉及 fork()/exec()/wait() 循环)。


因此,不要那样做:使用带有 -P 的 GNU xargs 版本,或者(如果必须的话)GNU parallel。

假设您的 targets 文件是换行分隔的,并且没有特殊的引号或字符,这可能很简单:

xargs -d $'\n' -n 1 -P 250 php b <targets

...或者,对于纯 POSIX shell:

xargs -d "
" -n 1 -P 250 php b <targets

关于bash - 从 bash 中的文件维护一定数量的并发作业 w/args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700646/

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