예전에 포스팅 했던 [리눅스] 파일 개수 구하기(find, wc 이용) 글에서, find 명령어를 이용해 이름 기준으로 파일을 검색하는 방법을 알아보았다. 이번에는 파일 크기를 기준으로 검색하고, 그리고 검색된 결과를 바로 삭제하는 방법을 알아본다.


리눅스 콘솔에서 find --help 명령어를 쳐보면 아래와 같이 find에 대한 설명이 나온다. 아래 설명에서 굵게 처리한 부분을 보면, 힌트를 얻을 수 있다.


# find -- help


사용법 : find [경로...] [수식]


default path is the current directory; default expression is -print

expression may consist of: operators, options, tests, and actions:


operators (decreasing precedence; -and is implicit where no others are given):

      ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2

      EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2


positional options (always true): -daystart -follow -regextype


normal options (always true, specified before other expressions):

      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf

      --version -xdev -ignore_readdir_race -noignore_readdir_race


tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N

      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME

      -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN

      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE

      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN

      -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N

      -used N -user NAME -xtype [bcdpfls]

      -context CONTEXT



actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 

      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit

      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;

      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;


find에서 -size 옵션을 주면 파일 크기를 기준으로 검색을 할 수 있고, -exec 옵션을 주면 검색 결과에 특정 액션을 할 수 있다. 그럼 케이스 별로 나누어 실제 사용 예시를 알아본다.



1. 파일 크기 기준으로 검색

# find ./* -size +N    => N 이상 크기의 파일을 검색한다.

# find ./* -size -N    => N 이하 크기의 파일을 검색한다.

# find ./* -size N      => N 크기의 파일을 검색한다.


** 사이즈 단위

b : 블록단위

c : byte

k : kbyte

w : 2byte 워드


예를 들어 콘솔 현재 경로에서 512byte 이상, 1024byte 이내의 파일을 찾고자 한다면 아래와 같이 입력하면 된다.

# find ./* -size +512c -size 1024c



2. 파일 검색 후 삭제

# find ./* [옵션] -exec rm -rf {} \;    => find 검색 결과를 모두 삭제한다.


예를 들어 콘솔 현재 경로 아래의 파일을 모두 삭제하고자 한다면 아래와 같이 입력하면 된다.

# find ./* -type -f -exec rm -rf {} \;



3. 복합

그럼 지난 포스팅의 내용과, 이번 포스팅의 내용을 복합하여 정리해보면 아래와 같은 명령어도 실행할 수 있다.

# find ./* -type -f -name '*.jpg' -size +512k -size -1024k -exec rm -rf {} \;

=> 현재 경로의 파일 중에 파일 확장자가 jpg이면서, 사이즈가 512kbyte 이상, 1024kbyte 이하인 것들을 모두 삭제한다.







리눅스에서 다량의 파일들을 전송/수신하고, 데이터 증분치에 대한 반영을 할 수 있는 가장 좋은 방법은 rsync가 아닐까 생각한다.(혹시 더 좋은 방법이 있으면 추천 부탁드립니다.) rsync 서버 및 클라이언트 설정 방법을 정리해본다. 여기서는 192.168.123.10에 있는 데이터를 192.168.123.11로 가져가는 예시를 들어본다.



<rsync 서버 설정>


rsync 서버 설정 1) rsync 패키지 확인

# rpm -qa | grep rsync


** 설치가 안 되어있을 경우

# yum install rsync



rsync 서버 설정 2) xinetd 패키지 확인

# rpm -qa | grep xinetd


** 설치가 안 되어있을 경우

# yum install xinetd



rsync 서버 설정 3) rsnyc 사용 설정

# vi /etc/xinetd.d/rsync

'disable = yes' 라고 되어있는 부분을 'disable = no' 로 변경한다.


===================================================================

# default: off

# description: The rsync server is a good addition to an ftp server, as it \

#       allows crc checksumming etc.

service rsync

{

        disable = no

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon

        log_on_failure  += USERID

}

===================================================================



rsync 서버 설정 4) rsync 설정

# vi /etc/rsyncd.conf

/etc/rsyncd.conf의 경우 처음에는 없는 파일일 가능성이 높다. 편집기를 이용해 새로 작성해준다.


====================================================

[rsync_test]                                 -> 사용할 rsync 서비스 이름

path=/data/rsync_test/                  -> 데이터 원본 경로

comment = rsync_test                   -> 코멘트

uid = root                                       -> 권한 사용자

gid = root                                       -> 권한 그룹

use chroot = yes

read only = yes

hosts allow = 192.168.123.11     -> rsync 클라이언트 IP. localhost일 경우 입력하지 않아도 됨

max connections = 3

timeout=600

====================================================



rsync 서버 설정 5) xinetd 서비스 재시작 및 방화벽 확인

# /etc/init.d/xinetd restart


보통 iptables 에서 포트가 막혀있는 경우가 많다.

rsync는 873 포트를 사용하므로, 873 포트 허용해준다.




<rsync 클라이언트 설정>


rsync 클라이언트 설정 1) rsync 접속 여부 확인

# telnet [rsync 서버 IP] 873

ex) telnet 192.168.123.10 873

telnet을 이용하여 873 포트가 정상적으로 연결되는지 확인한다.




rsync 클라이언트 설정 2) rsync 실행

# rsync -avz [IP]::[서비스명] 저장디렉토리

ex) # rsync -avz 192.168.123.10::rsync_test /data/rsync_test


혹시 내역을 로그로 남기고 싶을 경우 아래와 같이 입력한다.

rsync -avz 192.168.123.10::rsync_test /data/rsync_test > /data/rsync.log


유닉스 계열의 OS를 사용하다 보면 분명 디스크 공간은 여유가 있는데 디스크에 쓰기가 제대로 되지 않을 때가 가끔 있다.


이럴 때는 inode가 100% 사용 중인지를 확인해봐야 하는데, 솔라리스(SunOS)에서 inode 상태를 확인하는 방법은 아래와 같다.


1. SunOS 4.x 일 때

# /bin/df -i



2. SunOS 2.x 일 때

# /usr/bin/df -F utf -o -i



** 참고로 inode는 유닉스 계열의 파일스시템에서 사용하는 자료구조로, 파일이나 디렉토리 구조에 대한 정보를 담고 있다. 디스크 파티션을 나눌 때 각 파티션 별로 inode를 설정할 수 있다. 그리고 실제 운용 중인 서버에서 특정 파티션의 inode가 100%가 된다면, 해당 파티션의 inode설정을 바꾸거나 새로운 디스크 영역으로 데이터 저장경로를 옮겨야 한다. 이때 inode 설정을 변경하는 것은 운용 중인 데이터에 영향을 미칠 수 있으므로, 데이터를 백업해두고 inode 설정을 변경하는 것이 좋다.


** 위키백과 inode : http://ko.wikipedia.org/wiki/%EC%95%84%EC%9D%B4%EB%85%B8%EB%93%9C

AIX 서버를 사용하다 보면, 25번 포트를 사용하는 메일서버 어플리케이션을 실행할 때

리눅스의 sendmail 서비스가 이미 떠있어서 어플리케이션을 실행하지 못하는 경우가 생긴다.



1. AIX에서 sendmail 서비스 중지 방법


#  smitty


- Processes & Subsystems > Subsystems > Stop Subsystem > Stop & Single Subsystem


- Subsystem의 PROCESS ID 입력 란에서 <F4>


- sendmail 선택 후 <Enter>




2. AIX에서 부팅 시 sendmail 서비스가 실행되지 않도록 설정하는 방법


# vi /etc/rc.tcpip


start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"    ->    #start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"

(앞에 '#'을 추가하여 주석 추가)


리눅스에서 시스템 환경변수를 등록하는 방법은, 환경변수의 종류나 읽어들이는 시점 등에 따라 매우 다양한 것으로 알고 있다.


여기서는, 특정 실행파일을 더 쉽게 실행하기 위해 .bash_profile에 환경변수를 추가하는 방법에 대해서만 간단히 다룬다.



여기서 다루는 방법이 필요한 경우는, 특정 실행파일을 손쉽게 실행하고 싶을 때,


예를 들어 /usr/app/mysql 에 mysql가 설치되어있다고 해보자.


 이때 mysql을 실행하기 위해서는 # /usr/app/mysql/bin/mysql 이런식으로 실행을 해야 한다.


그런데 이를 단순히 # mysql 이라고만 입력해도 실행이 되게 하고 싶을 때 아래와 같이 환경변수를 등록해주면 된다.



# cd

($HOME 경로로 이동)


# vi .bash_profile

(.bash_profile을 vi편집기로 실행)


PATH=$PATH:HOME/bin:/usr/app/mysql/bin

(위와 같이 PATH로 된 부분에서 실행하고자 하는 파일이 있는 경로를 콜론으로 붙여서 추가한다)


:wq

(편집 중인 vi편집기를 저장하고 종료한다)


# source .bash_profile

(.bash_profile이 적용되도록 한다)


# mysql

(기존에는 /usr/mysql/bin/mysql 이라고 실행하던 것을, 위와 같이 손쉽게 실행할 수 있게 된다.)


리눅스, 유닉스 계열의 서버에서 특정 프로세스 상태를 확인하기 위한 명령어는 아래와 같다.


# ps -ef | grep [프로세스명]


ex. ps -ef | grep httpd  : 아파치 프로세스 확인

     ps -ef | grep mysql : MySQL 프로세스 확인



그런데 솔라리스 등의 OS에서는 프로세스 내용이 잘려서, 확인하고 싶은 경로나 설정 등을 확인하지 못할 때가 있다.


그럴 땐 아래와 같은 방법으로 확인하면 된다.


# /usr/ucb/ps -auxww | grep [프로세스명]


ex. /usr/ucb/ps -auxww | grep httpd : 아파치 프로세스 확인

     /usr/ucb/ps -auxww | grep mysql : MySQL 프로세스 확인


리눅스 OS를 서버로 사용할 경우, 특정 종류 혹은 모든 파일의 개수를 구해야 할 경우가 있다.


이때 사용되는 명령어를 간단히 정리해본다. 결론적으로 find와 wc 명령어를 사용하게 되는데, 우선 이 두 명령어가 어떤 명령어인지 간단하게 짚고 넘어가본다.



1. find 명령어


콘솔에서 find --help 라고 쳐보면 아래와 같은 내용이 출력된다.


사용법: find [경로...] [수식]

기본 경로는 현재 디렉토리입니다; 기본 수식은 -print입니다

수식은 다음과 같이 이루어질 수 있습니다:

연산자(감소하는 우선순위; 다른 것이 주어지지 않으면 -and가 묵시적으로 사용됨)

      ( EXPR ) | EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2


      EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2

옵션 (항상 참): -daystart -depth -follow --help

      -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev

시험 (N은 +N, -N, N이 될 수 있음): -amin N -answer FILE -atime N -cmin N


      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME

      -ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN

      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE


      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN

      -size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME

      -xtype [bcdpfls]


      -context CONTEXT


행동: -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT

      -ok COMMAND ; -print -print0 -printf FORMAT -prune -ls


=> 즉 find는 여러가지 조건을 가진 파일 혹은 폴더들의 목록을 검색하는 명령어이다.



2. wc 명령어


콘솔에서 wc --help 라고 쳐보면 아래와 같은 내용이 출력된다.


사용법: wc [<옵션>]... [<파일>]...

Print newline, word, and byte counts for each FILE, and a total line if

more than one FILE is specified.  With no FILE, or when FILE is -,

read standard input.

  -c, --bytes            print the byte counts

  -m, --chars            print the character counts

  -l, --lines            print the newline counts

  -L, --max-line-length  가장 긴 줄의 길이를 표시합니다

  -w, --words            단어의 개수를 인쇄합니다

      --help     이 도움말을 표시하고 끝냅니다

      --version  버전 정보를 출력하고 끝냅니다


=> 즉 wc는 파일의 줄이나 단어 수 등을 한번에 계산하여 확인할 수 있는 명령어이다.



3. 파일 개수 구하기


위 두 내용을 살펴보았을 때 파일 개수는 아래와 같이 구해야 한다는 것을 알 수 있다.


> find [디렉토리경로] -type f -name "[파일명규칙]" | wc -l


find의 결과로 출력되는 라인수 = 검색된 파일 개수이기 때문에 find로 특정 이름을 가진 파일을 검색하고, 이 결과의 줄 수를 출력하는 것이다.



예를 들어 /home 경로 안에서 확장자가 .log인 파일의 개수를 구하고자 할 때는 아래와 같이 입력하면 된다.


> find /home -type f -name "*.log" | wc -l


리눅스를 사용하다 보면, tar 혹은 tar.gz로 압축을 하거나 압축을 풀어야 할 경우가 자주 생긴다.


이를 처리하기 위해 리눅스에서는 tar 라는 명령어를 사용하게 되는데,


tar 명령어도 여러가지 옵션이 있지만 각 옵션에 대해서 알아보기 보단, 자주 사용하는 명령어 패턴만 정리한다.



1. tar로 압축하기

> tar -cvf [파일명.tar] [폴더명]


ex) abc라는 폴더를 aaa.tar로 압축하고자 한다면

     > tar -cvf aaa.tar abc



2. tar 압축 풀기

> tar -xvf [파일명.tar]


ex) aaa.tar라는 tar파일 압축을 풀고자 한다면

     > tar -xvf aaa.tar



3. tar.gz로 압축하기

> tar -zcvf [파일명.tar.gz] [폴더명]


ex) abc라는 폴더를 aaa.tar.gz로 압축하고자 한다면

     > tar -zcvf aaa.tar.gz abc



4. tar.gz 압축 풀기

> tar -zxvf [파일명.tar.gz]


ex) aaa.tar.gz라는 tar.gz파일 압축을 풀고자 한다면

     > tar -zxvf aaa.tar.gz




참고로, 위의 옵션들을 포함한 그나마 자주 사용되는 tar 명령어의 옵션들은 아래와 같다.



 옵션

 설명

 -c

 파일을 tar로 묶음

 -p

 파일 권한을 저장

 -v

 묶거나 파일을 풀 때 과정을 화면으로 출력

 -f

 파일 이름을 지정

 -C

 경로를 지정

 -x

 tar 압축을 풂

 -z

 gzip으로 압축하거나 해제함



리눅스 서버 부팅시각 확인 방법 1. last 로그 확인


> last reboot



리눅스 서버 부팅시각 확인 방법 2. dmesg 로그 업데이트 시각 확인


> ll /var/log/dmesg




이 외의 자세한 내용은 /var/log 밑에서 찾아보면...

현재 설정된 크론탭 조회


# crontab -l




크론탭 추가/수정


# crontab -e

(이후 화면에서 vi편집기에서 처럼 편집하면 된다.)


<설명>

1번필드 : 시간(분)

2번필드 : 시간(시간)

3번필드 : 일자

4번필드 : 월

5번필드 : 요일(0:일요일, 1:월요일, 2:화요일….)

6번필드 : 실행할 명령이나 스크립트


<예시>

00 02 * * * /usr/local/bin/test.sh >> /test.log

: 매일 02시에 /usr/local/bin/test.sh를 실행하고, 해당 로그를 /test.log에 저장한다.


00 02 * * 6 /usr/local/bin/test.sh

: 매주 토요일 02시에 /usr/local/bin/test.sh를 실행한다.