`-exec`로 검색하지만 지연이 발생함

`-exec`로 검색하지만 지연이 발생함

/dir디렉토리 내부의 모든 이미지의 이미지 크기를 최적화하는 다음 코드가 있습니다 .

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;

이 코드를 실행하면 서버 CPU가 많이 소모됩니다. 그래서 궁금합니다. 각각 사이에 지연을 추가할 수 있나요 exec? 예를 들어, 모든 이미지에 대해 호출될 때마다 100밀리초의 지연을 원합니다. exec이렇게 하면 CPU가 너무 많이 사용되지 않습니다.

무엇을 제안하시겠습니까? 내 서버에서 Centos 8을 실행하고 있습니다.

답변1

-execmore 를 사용하여 더 많은 명령을 추가할 수도 있습니다 .

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \; -exec sleep 0.1 \;

그러나 일반적으로 전체 작업을 수행하고 싶지만멋진다른 프로세스에 nice를 사용하는 것은 매우 간단합니다.

nice find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;

답변2

nice이것이 와 같은 명령어가 ionice만들어진 이유이다 .

  • nice프로세스 CPU 우선순위를 낮추는 데 사용할 수 있습니다.
  • ionice프로세스 IO 우선순위를 줄이는 데 사용할 수 있습니다.

이들의 조합을 통해 프로세스는 사용 가능한 프로세서 및 IO 기능의 작은 부분만 차지하도록 할 수 있습니다. 이 예에서는 프로세스 IO를 "최선의 노력" 클래스의 가장 낮은 끝으로 푸시합니다.

ionice -c2 -n7 find...

IO 하위 시스템이 유휴 상태일 때만 프로세스가 실행되도록 하려면 로 -c2변경 하세요 .-c3

이 예에서는 프로세서 허용량을 낮은 우선순위로 낮춥니다.

nice -n12 find...

가능한 가장 낮은 우선순위를 위해 -n12으로 변경하십시오 .-n19

최대 효과를 얻으려면 다음을 결합하십시오.

ionice -c2 -n7 nice -n12 find...

답변3

발견된 모든 이미지 파일에 대해 실행되는 for 루프를 실행하는 -exec옵션 과 함께 쉘 루프를 사용할 수 있으며 지연이 추가됩니다.findjpegoptim

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec sh -c '
  for file; do jpegoptim --strip-all "$file"; sleep 0.1; done' -- {} +

답변4

을 사용하면 각 파일에 대해 -exec cmd ... {} ';'하나의 인스턴스를 실행하게 됩니다 cmd. jpegoptim호출당 두 개 이상의 파일을 처리할 수 있으므로 다음과 같이 변경하면 CPU의 많은 작업을 피할 수 있습니다 -exec cmd ... {} +.

LC_ALL=C nice find . '(' -name '*.[jJ][pP][gG]' -o -name '*.[jJ][pP][eE][gG]' ')' \
  -type f -exec jpegoptim --strip-all {} +

(여기서 find명령은 표준 구문으로 변환되고 개선되어 다음과 일치합니다.모두대소문자를 구분하지 않고 일반 파일로 제한되는 파일 이름 .jpg) .jpeg.

nice스케줄러 에게 실행 중인 작업보다 다른 작업의 우선순위를 지정하도록 지시합니다 find. 프로세서에 여유 시간이 많을 때에도 jpegoptim이러한 작업을 임의로 배치하는 것보다 훨씬 더 효율적입니다 (또한 유틸리티를 실행, 로드, 초기화하는 데 약간의 CPU 시간이 걸린다는 점을 고려하십시오).sleepsleep

관련 정보