"-exec"를 사용하여 검색하지만 지연이 발생함

"-exec"를 사용하여 검색하지만 지연이 발생함

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

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

이 코드를 실행하면 서버 CPU가 많이 소모됩니다. 그래서 궁금합니다. 각 항목 사이에 지연을 추가할 수 있나요 exec? 예를 들어, execCPU가 너무 바쁘지 않도록 각 이미지에 대한 각 호출 사이에 100밀리초의 지연을 원합니다 .

어떤 제안이 있나요? 내 서버에서 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

쉘 루프를 사용하고 -exec선택적으로 발견된 각 이미지 파일에 대해 findfor 루프를 실행 jpegoptim하고 지연을 추가할 수 있습니다.

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

답변4

를 사용하면 -exec cmd ... {} ';'파일당 하나의 인스턴스를 실행하게 됩니다. 각 호출은 여러 파일을 처리할 수 있으므로 다음과 같이 변경할 수 있습니다.cmdjpegoptim-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. 프로세서에 여유 시간이 충분하더라도(또한 실행, 로드, 초기화 등과 같은 유틸리티에 약간의 CPU 시간이 필요하다는 점을 고려) 이러한 작업을 임의로 배치하는 것보다 훨씬 더 효율적입니다.jpegoptimsleepsleep

관련 정보