![从文件循环读取时,运行多个线程](https://linux22.com/image/176540/%E4%BB%8E%E6%96%87%E4%BB%B6%E5%BE%AA%E7%8E%AF%E8%AF%BB%E5%8F%96%E6%97%B6%EF%BC%8C%E8%BF%90%E8%A1%8C%E5%A4%9A%E4%B8%AA%E7%BA%BF%E7%A8%8B.png)
我已经构建了不使用线程的 bash 脚本。我想在您的帮助下实现它。
我正在运行Threadripper 3990X
意味着我可以运行很多线程。
现在我的 bash 脚本看起来像这样:
#!/bin/bash
#!/usr/bin/env python3
while true; do # Start
while read -r line; do # 1
python3 script1.py -d $line --output file.txt # 2
done < domain && while read -r line; do # 3
./script2 -d $line # 4
done < domain && while read -r line; do # 5
go run main.go -d $line -o file2.txt # 6
done < domain && mv *.txt /mnt/c/savehere && # 7
dos2unix savehere/*.txt && sort savehere/*.txt | uniq | tr -d '<>,' > results-$(date +%d-%m-%Y_%H_%p).txt && python3 discord-notify.py # 8
done # End
domain
文件包含500-1500
域列表,然后bash, python, golang
逐行传递给脚本,完成后,它们将.txt
文件输出到"root"
文件夹,然后移动到/mnt/c/savehere
文件夹并合并到一个.txt
文件中,完成后通知我不和谐和自动。再次启动 bash 脚本。
速度实际上并没有那么慢,但是因为我运行的是强大的 CPU,所以可能有办法使这个脚本运行得更快并节省大量时间。
答案1
适当的缩进确实可以增加清晰度。不要忘记引用您的变量:
while true; do
while IFS= read -r line; do
python3 script1.py -d "$line" --output file.txt
done < domain &&
while IFS= read -r line; do
./script2 -d "$line"
done < domain &&
while IFS= read -r line; do
go run main.go -d "$line" -o file2.txt
done < domain &&
mv *.txt /mnt/c/savehere &&
dos2unix savehere/*.txt &&
sort savehere/*.txt | uniq | tr -d '<>,' > results-$(date +%d-%m-%Y_%H_%p).txt &&
python3 discord-notify.py
done
xargs
可以像 shell while-read 循环一样工作,并且可能会快得多:
while true; do
xargs -d '\n' -I LINE python3 script1.py -d LINE --output file.txt < domain &&
xargs -d '\n' -I LINE ./script2 -d LINE < domain &&
xargs -d '\n' -I LINE go run main.go -d LINE -o file2.txt < domain &&
mv *.txt /mnt/c/savehere &&
dos2unix savehere/*.txt &&
sort savehere/*.txt | uniq | tr -d '<>,' > results-$(date +%d-%m-%Y_%H_%p).txt &&
python3 discord-notify.py
done