首页 > 解决方案 > Shell 错误 xargs:由信号 11 终止

问题描述

我正在使用图像压缩工具 jpeg-recompress 上的带有目录排除的 FIND 命令,并使用 xargs 来加速该过程。

命令行是:

find /path/dir -type f -name '*.jpg' -not -path '*/imdb/*' | xargs -P 50 -I {} jpeg-recompress --quality high --min 60 --method smallfry --strip \{} \{} \;

几分钟后发生错误:

xargs: jpeg-recompress: terminated by signal 11

只有在处理包含数十万张图像的大型目录时才会发生这种情况。我已经搜索了与分段错误相关的信号 11,但我不太了解它们。我唯一知道的是,大概我正在尝试访问一些我不应该访问的内存。

请帮忙,我不太了解代码,也不明白我做错了什么。

谢谢你的帮助。

标签: linuxshellsegmentation-faultxargs

解决方案


错误jpeg-recompress不是来自xargsjpeg-recompress由于 SIGSEGV 而死。分段错误通常仅在程序中存在错误时才会发生 - 通常是错误的指针。

我相信这是由于一个错误引起的,该错误jpeg-recompress由单个稍微损坏的 jpeg 文件(或者恰好具有不期望的格式jpeg-recompress)触发。

这也解释了为什么您只能在包含数十万张图片的大目录中看到此内容:其中一张有点损坏。

识别文件的一种方法是使用 GNU Parallel 的--joblogand --halt

find /path/dir -type f -name '*.jpg' -not -path '*/imdb/*' |
  parallel --joblog my.log --halt now,fail=1 jpeg-recompress --quality high --min 60 --method smallfry --strip \{} \{}

然后你应该在my.log.

如果您认为可能有更多损坏的文件:

find /path/dir -type f -name '*.jpg' -not -path '*/imdb/*' |
  parallel --joblog my.log jpeg-recompress --quality high --min 60 --method smallfry --strip \{} \{}
grep -P '\t11\t' my.log

推荐阅读