find vs locate and updatedb
개요
find와 locate는 동일한 결과를 보인다고 생각할 수 있는데 왜 두개의 명령으로 나눠뒀는지 궁금해할 수 있다.
1. find는 물리적으로 search를 한다. 그래서 항상 최신의 정보이다. 옵션을 더 세밀하게 사용할 수 있다.
2. locate는 updatedb command에 의해 리스팅된 상태의 정보를 통해 search를 한다. 예전 버전의 정보일 수 있다. cron을 통해 매일 하루에 한번씩 이 정보도 업데이트된다. 이름만 옵션으로 줄 수 있다.
속도
# time find / -name *.arc
....
real 0m5.323s
user 0m0.074s
sys 0m2.040s
# time locate /*.arc
real 0m0.236s
user 0m0.213s
sys 0m0.004s
최신 데이터와 old data
# cd ~
# touch ddd.arc
# locate *.arc | grep ddd <- 아무 결과도 출력되지 않음
# find ~/ -name *.arc
/root/ddd.arc
# updatedb <- 수동으로 file list를 업데이트해준다.
# locate *.arc | grep ddd
/root/ddd.arc
cron.daily의 등록여부 확인
# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
# cd /etc/cron.daily/
# grep updatedb *
mlocate.cron:/usr/bin/updatedb -f "$nodevs"
매일 4시 2분에 cron.daily가 실행되며, 그 안의 mlocate.cron을 실행하여 updatedb를 수행함을 알 수 있다.
주의사항
간혹 이 updatedb 명령이 nfs로 마운트된 영역을 검색하면서 느려질 경우가 수 있고 DB가 설치된 환경이라면 조정이 필요할 수 있다.
예를 들어 nfs 영역에 archive나 trace file을 저장하도록 설정하였는데 로그 스위치가 자주 발생하여 아카이브 로그 파일이 많이 생성되거나 trace파일이 엄청나게 생성되었을 경우 updatedb 명령시에 부하가 발생하게 된다.
이때 만약 RAC환경에서 nfs영역에 voting disk가 위치한다면 최악의 경우 eviction까지 이루어질 수 있다(매우 rare하다).
그래서 nfs는 주로 updatedb에서 제외하는 것을 권장하고 있다.
PRUNEFS = "auto afs gfs gfs2 iso9660 sfs udf vmhgfs"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp"
위가 기본값이다.
PRUNEFS: df에서 확인할 수 있는 file system으로 제외한다. 이곳에 nfs를 추가하면 nfs 파일시스템은 updatedb 수행시 제외한다.
PRUNEPATHS: 경로를 지정하여 제외한다.