/dir
디렉터리에 있는 모든 이미지의 이미지 크기를 최적화하는 다음 코드가 있습니다.
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
이 코드를 실행하면 서버 CPU가 많이 소모됩니다. 그래서 궁금합니다. 각 항목 사이에 지연을 추가할 수 있나요 exec
? 예를 들어, exec
CPU가 너무 바쁘지 않도록 각 이미지에 대한 각 호출 사이에 100밀리초의 지연을 원합니다 .
어떤 제안이 있나요? 내 서버에서 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
쉘 루프를 사용하고 -exec
선택적으로 발견된 각 이미지 파일에 대해 find
for 루프를 실행 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
-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 시간이 필요하다는 점을 고려) 이러한 작업을 임의로 배치하는 것보다 훨씬 더 효율적입니다.jpegoptim
sleep
sleep