linux - 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,但我不太了解它们。我唯一知道的是,大概我正在尝试访问一些我不应该访问的内存。
请帮忙,我不太了解代码,也不明白我做错了什么。
谢谢你的帮助。
解决方案
错误jpeg-recompress
不是来自xargs
:jpeg-recompress
由于 SIGSEGV 而死。分段错误通常仅在程序中存在错误时才会发生 - 通常是错误的指针。
我相信这是由于一个错误引起的,该错误jpeg-recompress
由单个稍微损坏的 jpeg 文件(或者恰好具有不期望的格式jpeg-recompress
)触发。
这也解释了为什么您只能在包含数十万张图片的大目录中看到此内容:其中一张有点损坏。
识别文件的一种方法是使用 GNU Parallel 的--joblog
and --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
推荐阅读
- javascript - 赛普拉斯:`cy.contains` 和 `cy.contains` 有什么区别?查找文本`
- apache-spark - 在 spark-submit 命令中设置 default.parallelism
- list - Racket/Scheme - 根据位置替换列表中的元素
- r - 面板的淡入淡出以指示正在进行的时间
- javascript - JS 异步目录列表
- firebase - Flutter:如何在控制台中显示 Firebase Auth 异常?
- c# - 运行所有测试后,NUnit Selenium webdriver 未关闭
- reactjs - React material-ui TextField,输入为白色
- python - 熊猫:考虑多种条件正确过滤数据框列
- python - Python中类对象的属性错误 - 朴素贝叶斯