출처: http://program.egloos.com/802690

[참고할 사이트] http://www.adminschoice.com/docs/crontab.htm

crond 데몬 /etc/rec.d/init.d/crond 스크립트에 의해 시작, 종료,재시작될 수 있다

기본 명령의 위치 :/user/bin/crontab

 =>아무곳에서도 실행 가능 함 등록,수정, 보기



사용형식

crontab [ -u 사용자 id] 파일

crontab [-u 사용자 id] { -l | -r | -e}


crontab -l : 예약된 작업리스트

crontab -e : 예약된 작업 수정

crontab -r : 예약된 작업 삭제



crond 실행 확인

=> ps -ef | grep crond



crond 시작

=> /etc/rc.d/init.d/crond start{restart | stop}


일반사용자에게 crontab 명령어 사용하도록 설정 허가

=> /etc/cron.allow 여기에 ID 등록


일반사용자의 crontab 명령어사용을 제한하고자 한다면

=>/etc/cron.deny  에 ID를 등록

즉,

=> /etc/cron.allow : 허용할 사용자 ID 목록
=> /etc/cron.deny  : 거부할 사용자 ID 목록

cron.allow 파일이 있으면 이 파일에 들어있는 ID만 사용 가능
cron.deny  파일이 있으면 이 파일에 들어있는 ID는 사용 불가

따라서 cron.deny에 truefeel ID를 추가해주면 됩니다.



등록 내용 설정

"분,시,일,월,요일, 실행명령" 순으로 설정



crontab 파일 형식
------    --------  ---------------------------------------------------
필  드    의  미    범  위
------    --------  ---------------------------------------------------
첫번째    분        0-59
두번째    시        0-23
세번째    일        0-31
네번째    월        1-12
다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)
여섯번째  명령어    실행할 명령을 한줄로 쓴다.
------    --------  ---------------------------------------------------

- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다 (주석)

 

 

crontab -e 을 하면 vi 에디터가 나온다.(환경변수 EDITOR에 따라 다른 에디터를 사용할 수 있다.)


  $ crontab -e
  # /home 디렉토리를 /BACKUP/home 으로 백업해둠
  # 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일 
  30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1

  # 파일/디렉토리 퍼미션 설정
  # 40분, 새벽 1시, 매주 일요일
  40 1    * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1


  # 20분마다 실행

  */20 * * * * /shell/mrtg


위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.

vi 에디터를 통해 설정을 하므로 중요한 몇 가지 에디터 사용법은 익혀야 한다.

----  -----------------------------------------------------------------------------
키    의미
----  -----------------------------------------------------------------------------
i     현재 칸에 글을 넣는다.
o     다음줄에 글을 넣는다.
dd    한줄을 삭제한다.
:wq   저장하고 빠져나온다.
ESC   설정중에 명령어 모드(위의 i, o, dd 등을 사용할 수 있는 상태)로 빠져 나온다.
----  -----------------------------------------------------------------------------


설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.

- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.
  (2~10까지 3간격으로. 즉, 3,6,9를 의미함)

=>  > /dev/null  2>&1 이 무슨 뜻입니까?
  지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
  뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.


예)

20  2     *  *  6  명령어 => 매주 토요일 새벽 2:20

0  4-6   *  *  *  명령어 => 매일 오후 4,5,6시

5  */2 *  *  * 명령어 => 매일 2시간간격으로 5분대에

15  1   1  *  *  명령어 => 매월 1일 새벽 1:15

30  0   1  1,7  *  명령어 => 1,7월 1일 새벽 0:30


10 2 * * * /app11/minsang/APP/ldap/run.sh > /app11/minsang/APP/ldap/cron_error.log
55 13 * * * /run.sh > /mail_cron_error.log
0,30 8-19 * * * /sendAdmin.sh > /cron_admin_error.log


쉘스크립트의 첫 라인에 #!/bin/bash 를 기제하는 이유

쉘스크립트 작성시, 가장 첫 라인에 #!/bin/bash 를 기제하는 이유는, 스크립트 파일이 bash 쉘로 실행시킨다는 의미입니다. 같은 원리로 tcsh 쉘로 실행시키려면, 첫라인은 #!/bin/tcsh 로 시작해야 합니다.

!/bin/bash 를 기제를 하지 않아도 실행된다면, 이는 리눅스 배포판은 기본적으로 bash 쉘로 설정되어있어서 동일한 bash 쉘상에서 무리없이 작동되는 경우입니다. !/bain/bash 를 지정해서, bash 쉘 파일임을 미리 알려주는 것이 다른 쉘간의 오류를 방지하는 방법입니다.

(참고)
쉘스크립트에서 #는 주석기호이지만, 첫라인의 #!/bin/bash 에서의 #은 주석기호가 아니라는 점..

bash 와 sh 를 혼용해도 될까요?

결론적으로 모두 같은 의미입니다.
#!/bin/bash
#!/bin/sh

SSH / Telnet 상에서 아래 명령어를 입력해보세요.
ls -al /bin/sh

실행결과 : /bin/sh -> bash

즉, sh 가 bash 의 심볼릭링크로 설정되어있으므로, 서로 혼용해서 사용해도 된다는 의미입니다.

출처 : http://blog.whenji.com/278


<< 캡쳐자료입니다>> 


원문 출처 : http://blog.naver.com/dangtong76/140054144449





[정보] 초간단 CORE 파일 분석방법

오늘 턱시도 서비스하나가 반영이됐는데 해당 서비스가 특정패턴으로 수행될경우 턱시도 서버를 죽이는 현상일 발생했습니다.

그림에서 처럼 crt100n 이란 턱시도 서비스가 CRS102T 라는 서비스를수행 하려다가 뒤져버렸습니다.

호랑이는 죽어서 가죽을 남기고 프로세스는 죽어서 CORE 를 남깁니다.

The GNU Debugger(보통 GDB 라고 부릅니다) 라는 프로그램을 통해 CORE 파일을 분석해보기로 마음먹었습니다.

GDB 는 거의 대부분의 유닉스 서버에 다 깔려있습니다.

1단계 : CORE 파일의 정체를 파악

core 라는 이름만 가지고는 누가 죽어서 남긴 놈인지 알수가 없습니다. 그래서 file 이라는 명령을 통해 core

파일을 생산한 놈이 누구인지 확인을 해야 합니다.


보시다 시피 해당 core 파일은 08:54 분에 죽은 crt100n 이라는 프로세스가 남긴거네요 ㅋㅋ ^^

2단계 : GDB를 이용한 CORE 파일 분석

gdb사용법 : gdb 수행파일 CORE파일

ex) gdb ./crt100n ./core

아래를 보시면 먼저

Core was generated by `crt100n'.

Program terminated with signal 11, Segmentation fault.

crt100n 이라는 프로세스가 메모리 세그먼트 오류로 인해 죽었고 죽으면서의 마지막 한마디는 "11" 입니다. ^^ ㅋ


3단계 : 문제의 시점(죽은시점)에 무슨일을 했을까?

문제의 시점에 해당 프로세스가 수행한 일을 보기 위해 "where" 라는 gdb 명령어를 사용합니다. where 라고 치면

죽은시점에서스 함수 CALLSTACK(함수호출순서) 을 보여줍니다. 보는 방법은 자바와 마찬가지로 밑에서부터 위로

수행됐다고 보시면 됩니다.

죽은 원인은 "error accessing memory address 0x0: Invalid argument." 이고 해당 에러가 발생할때의 행동은

CRS105T -> CRS102T -> tpenqueue -> tmatmienter -> tmreattach -> _gp_shmat -> malloc -> _sscanf -> sigfillset

순으로 함수가 호출되었고 sigfillset 이란 함수를 수행하다가 죽었습니다.  왜냐면 제일마지막에 수행한 놈이니깐요.


여기서 잠깐 프로그램이 함수호출과정을 간단하게 살펴보겠습니다.

우리가 프로그램을 짜면 하나의 프로그램은 다음과 같이 구성되어 집니다

user define function(사용자 정의 함수) / application programming Interface (API) / standard library (STD library) / system call (OS 호출함수)

대부분의  프로그램의 호출 순서는 다음과 같습니다

패턴1 : 사용자정의함수 -> STD library -> system call

패턴2 : 사용자정의함수 -> API -> STD library -> OS호출함수

GDB 결과를  보시면 CRS105T 라는 프로그램에서 턱시도함수 tpenqueue (API) 를 호출합니다. 그리고 턱시도 함수는 우리가 학교다닐때배운 malloc 이라는

standard 라이브러리에 있는 함수를 호출합니다. 그리고 다시 malloc 이라는 함수는 _sscanf 라는 system call 함수를 호출합니다.

그래서 요약해보면 CRS105T -> CRS102T -> 턱시도함수 -> STD Library Function -> System call function 으로 순서가 정해집니다


# find / -name use* [Enter]

1) find : 원하는 내용 찾기
2) / :  root에서부터 찾기... 원하는 디렉토리 있다면 해당 디렉토리 입력
3) -name : 옵션, 파일 이름으로 찾기
4) use* : 'use'를 포함한 *(전체) 찾기


# ln 명령어

1) 하드링크 :  "ln"명령어로 같은 파일을 생성하면 수정시 같이 수정되지만 삭제할 때에는 아무런 영향이 없다.
2) 심볼릭링크 : 파일 링크를 단지 가리키기만 하고 그것에 대한 정보만 가지고 있어 파일 크기가 작다.


* 추가 공부사항은 계속 추가 기록된다.. 쭈욱~~~ ^^;

1. 압축

# tar -cvf [filename].tar a.txt b.txt c.txt
# tar -czvf [filename].tar.gz a.txt b.txt c.txt



2. 압축풀기

# tar -xvf [filename].tar
# tar -xzvf [filename].tar.gz

+ Recent posts