我必须为项目使用 clamAV 签名数据库编写病毒扫描程序。为了提高速度,我使用线程。(组合 & 并等待)我的代码是如何工作的:
它读取文件夹和子文件夹中的所有文件
function recursive_files()
{
files=$(find $folder_path -type f)
for f in $files
do
raw_and_scan "$f" &
done
wait
}
如您所见,每个文件都有一个线程。
function raw_and_scan()
{
raw_test_file $1
read_signature_db_by_line $1
}
read_signature..读取签名库的每一行
function read_signature_db_by_line()
{
cat $signature_path | (while read LINE ; do
stringtokenizer_line_db $LINE $1 $raw_file &
done
wait
) }
如您所见,DB 的每一行都有一个线程。
我做了双线程实现,因为我看到了巨大的性能(使用时间基准)
当我将 50 个包含 50 行的文件扫描到数据库中时。它工作正常。
但是当我扫描我的主文件夹(800 个文件)时,它不起作用,更糟糕的是,我收到了一个警告(不能 fork() 了)并且我的计算机死机了,它需要重新启动。
我观察这个过程(htop)直到它工作了 5000 个任务。
您可以提交我的项目https://github.com/peondusud/Bash.antivir
最后,我会使用数据库 65000 行扫描文件夹。
如果您有任何想法限制线程或类似的东西。
谢谢。