ImageMagick转换循环挂起

3

我正在运行一个脚本,旨在调整文件夹及其子目录中所有图像的大小,如果尺寸符合某个特定大小,则会进行调整。但是,当处理了大约1000-2000张图片后,脚本会在“convert”命令处挂起。(每次挂起时所处理的确切图像都不同)。

#! /bin/bash

for f in $(find . -wholename "./raw/*.jpg"); do
    # fwidth, fheight, outputdir, filename variables defined...

    if [ "$fwidth" -gt 1000 ] || [ "$fheight" -gt 1000 ]; then
        convert -resize 60% -quality 92 -unsharp 0x0.5 $f ${outputdir}/${filename};
    else
        cp $f ${outputdir}/${filename};
    fi
done

1
应该在查找时加上 -type f 限定符,以仅查找文件,不确定 convert 命令对任何目录会做什么? - Jeff Foster
它已经成功地通过了多个目录,所以我认为它当前工作得很好。 - user706177
遇到了同样的问题。你解决了吗? - zaf
在我的情况下,新安装的ImageMagick转换第一张图片花费了很长时间,但之后它们都非常快。我想知道这是否是某种JIT编译,但我认为IM是用C++编写的,所以不确定。 - Matthew Lock
1个回答

1

首先更详细地描述一下“挂起”的含义。它是否停止执行?convert 是否会在某段时间内以100%的CPU使用率工作?还是其他什么原因?

然后开始调试脚本。请添加一些调试输出,并尝试使用 bash -x script.sh 运行脚本,这应该输出实际运行的所有命令。

#! /bin/bash

for f in $(find . -wholename "./raw/*.jpg"); do
    echo "=========== processing file $f"
    # fwidth, fheight, outputdir, filename variables defined...

    if [ "$fwidth" -gt 1000 ] || [ "$fheight" -gt 1000 ]; then
        convert -verbose -resize 60% -quality 92 -unsharp 0x0.5 $f ${outputdir}/${filename};
    else
        cp -v $f ${outputdir}/${filename};
    fi
done

1
谢谢。当脚本挂起时,CPU使用率保持在约60%左右(当脚本未运行时,它约为30%)。我所说的挂起是指“bash -x script”在某个迭代期间会在“convert -resize ...”上卡住一个多小时(然后我杀死脚本)。发生这种情况的文件并不总是相同的。此外,文件名中没有特殊字符。 - user706177
1
如果您稍后在命令行上执行从未成功的命令,它会起作用吗? - Daniel Böhmer
1
好问题。convert -resize 60% -quality 92 -unsharp 0x0.5 ./raw/data/2/default_2_fk.jpg ./edited/data/2/default_2_fk.jpg 是脚本最后卡住的那一行,当我从命令行运行它时也卡住了。据我所知,这张图片没有什么特别之处。当我更改目标文件夹时,它在命令行上运行正常,尽管脚本能够将其他图像保存到该目标文件夹中。 - user706177
1
我运行了脚本几次。结果发现它倾向于卡在大约3个不同的图像之一上。我不确定它们有什么特别之处。 - user706177
1
看起来bash脚本完全没问题,但是convert在处理你的特殊文件时出了问题。 - Daniel Böhmer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接