/dir
디렉토리 내부의 모든 이미지의 이미지 크기를 최적화하는 다음 코드가 있습니다 .
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
이 코드를 실행하면 서버 CPU가 많이 소모됩니다. 그래서 궁금합니다. 각각 사이에 지연을 추가할 수 있나요 exec
? 예를 들어, 모든 이미지에 대해 호출될 때마다 100밀리초의 지연을 원합니다. exec
이렇게 하면 CPU가 너무 많이 사용되지 않습니다.
무엇을 제안하시겠습니까? 내 서버에서 Centos 8을 실행하고 있습니다.
답변1
-exec
more 를 사용하여 더 많은 명령을 추가할 수도 있습니다 .
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
옵션 과 함께 쉘 루프를 사용할 수 있으며 지연이 추가됩니다.find
jpegoptim
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 시간이 걸린다는 점을 고려하십시오).sleep
sleep