Upload
nguyenkien
View
216
Download
0
Embed Size (px)
Citation preview
CHOCHO
ANDRLINUX
WHEEL SE
SAPZIL
SHELL SCRIPT & CRON
CHOCHO
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트란?
CHOCHO
ANDRLINUX
WHEEL SE
SAPZIL
그전에...쉘이란?
ANDR ANDRLINUX
WHEEL SE
SAPZIL유저와 시스템간의 대화를 중계
명령어를 해석하여 Kernel에 전달
KERNAL SHELL USER
ANDRLINUX
WHEEL SE
SAPZIL
ANDR쉘 ‘스크립트’란?
쉘을 통하여 프로그램을 만든 것
여러 라인의 코드를 모아놓은 쉘을 위한 스크립트
파이썬에서의 소스코드 파일을 파이썬 스크립트라고 부르듯 쉘 스크립트도 똑같다
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
ANDR ANDR시작해볼까요?
- 쉘 스크립트를 만들기 위해서 vi 이용
- 스크립트 파일의 가장 첫 라인은 #!/bin/bash 로 시작
SHEBANG
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
!
Hello World! /#/test/
ECHO??
/#/test/shelltest echo가 무슨 명령어인지는 조금 있다가 알아봅시다
ANDRLINUX
WHEEL SE
SAPZIL
Shebang 이란 리눅스에서는 확장자가 윈도우처럼 파일의 형식을 지정하지 않아도 실행 파일을 만들 수 있도록 스크립트 내에 적는 라인. 인터프리터 지정 없이도 Shebang 라인을 통해서 이 파일이 어떤 프로그램을 통해 실행 될 것인지 파악하게 됩니다.
잠깐, SHEBANG 이란?
!
ANDR ANDRLINUX
WHEEL SE
SAPZIL
방법1
방법 2주의사항
! TIP
이근홍선배님“유저권한으로 하는게 더 좋아요. chmod u+x 추천”
잠깐, SHEBANG 이란?
인터프리터 파일이름.확장자
ex.
스크립트 내에 쉬뱅 라인을 넣고./파일이름 단, 파일 실행 권한을 줘야함
스크립트 실행 전에chmod +x 파일이름
ANDRLINUX
WHEEL SE
SAPZIL
방법 2 BETTER
잠깐, SHEBANG 이란?
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부: (0) 명령어$ echo [str]: 뒤에 전달되는 Str을 출력한다. $ pwd : 현재 경로ex.
$ file [파일이름] : filename의 filetype을 출력한다.ex.
$ cat 파일의 내용을 화면에 출력하는 데 사용되기도 하며 파일을 다른 곳에 순차적인 스트림으로 보내기 위해 사용된다.
ANDR ANDRLINUX
WHEEL SE
SAPZIL앞 명령 output을 뒷 명령이 input으로 받아들이도록 함ex.ls | grep.txt 를 하면 ls로 나타나는 모든 파일 중 이름에 txt가 들어가는 파일들만 출력해준다.
쉘 스크립트 공부: (0) 명령어
$ tee [option] [파일이름] : 표준출력을 file에 쓰기독립적으로 사용되기 보다는 파이프를 이용하여 다른 command와 함께 사용
ex.
해당 디렉토리 리스트를 result.html 파일에 저장한다.
잠깐, | pipe 를 알고가자
ANDRLINUX
WHEEL SE
SAPZIL! TIP
Grep은 강력한 명령어.보다 자세히는 링크 참조http://geundi.tistory.com/113
쉘 스크립트 공부: (0) 명령어
$ basename [file] : 디렉토리명을 제외한 파일명$ dirname file : 파일이름 제외한 디렉토리명
$ grep [str] [file] : 파일 안에서 특정한 패턴(문자열)을 찾는다. 해당 패턴이 있는 줄 전체를 출력한다.ex.grep [옵션] [정규표현식(문자열)] [찾기 대상이 될 파일명]
ANDRLINUX
WHEEL SE
SAPZILANDR
| pipe 짚은 김에 잠깐 redirection도 짚고 넘어갑시다
redirection: 표준 입력/출력/에러를 화면이 아닌 파일로 대체하는 것을 말한다.
>: redirect output
>>: append output
<: redirect input
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부: (0) 명령어
$ export 환경변수 = 값 : parent shell 에서 생성한 변수를 child shell에서도 inherit 할 수 있도록 하는 명령어.ex.
export를 쉘 스크립트에서 쓰기/a.sh /b.sh
WHY???
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부: (0) 명령어
Bash 와일드카드
“*” - 모든 character를 대체“?” - 하나의 character를 대체“[]” - 값의 지정된 범위를 대체“{}” - 지정된 리스트에 있는 값들
ANDRLINUX
WHEEL SE
SAPZIL! TIP
특정한 환경 변수의 내용만 알고 싶다면 echo $[파일이름]printenv | grep [name]
! TIP
printenv를 하면 모든 환경변수들을 볼 수 있다!
잠깐 variable을 짚고 넘어갑시다
크게 두가지로 나뉨
1. 시스템 변수: 하나의 쉘프로그램에서만 사용 가능한 변수 - 지역변수
2. 환경 변수: 모든 쉘프로그램에서 사용 가능한 변수 (대문자) - 전역변수
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (1) 변수
변수이름=값
[주의점]- ‘=’ 사이에 좌우 공백 용납 안함 - 대소문자를 구분한다- 숫자형 변수와 문자형 변수, 구분 안함함- 변수의 내용을 사용시 ‘$(변수명)’ 처럼 쓴다.
ANDRLINUX
WHEEL SE
SAPZILa.py는 실행성공, b.py는 오류
쉘 스크립트 공부 (1) 변수 +특수변수
$0 : 현재 쉘스크립트의 파일명 (파이썬의 sys.argv)$1 ~ $n : Shell에 부여된 argument의 값 (순서대로)- argument 0번은 쉘 파일 그 자체가 되고, 1번부터는 앞에서부터 하나씩
$? : 이전에 수행한 명령이 성공했는가? 에 따른 번호 (실행됨 - 0)ex.
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (1) 변수 +
특수변수
$$ : Shell 자신의 PID$! : Shell이 마지막에 실행한 background process PID$* : 모든 위치 매개변수를 평가$@ : 큰 따옴표를 사용하였을 때를 제외하고는 $*과 동일한 의미# : Shell에 부여된 인수의 개수
${}: string 중간에 변수를 쓰고 싶을 때
$FOOfoo 는 FOOfoo라는 이름의 변수를 뜻하는 것이기 때문에 blank
ANDR ANDRLINUX
WHEEL SE
SAPZIL
잠깐! Error(exit status)숫자 0 은 정상종료,
1~255 는 에러 코드들 - 숫자마다 다른 에러
$?를 사용하여 이 숫자들을 받는다!
(참고)bit 서버에서는 permission denied 이지만/usr/include/asm-generic/errno-base.h 와/usr/include/asm-generic/errno.h 로 모든 에러코드들을 확인할 수 있다.
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (2) 숫자계산
연산자와 숫자, 변수, 기호 사이사이에는 space를 넣는다.
+(더하기), -(빼기), /(나누기) : 자세한 설명은 생략한다*(곱하기): 사용할때는 ‘\*’를 쓴다( ‘*’도 가능)%(나누기 나머지값)
expr: 숫자계산[주의] expr로 지정하는 경우 역작은따옴표(`)를 사용하자. 작은따옴표(‘)가 아니다!!
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
#/test/shellcal
쉘 스크립트 공부 (2) 숫자계산
ANDR
ANDRWHEEL SE
ANDRLI`NUX
WHEEL SE
SAPZIL
#/test/shellread
쉘 스크립트 공부 (3) 사용자의 입력
read 를 사용하면 사용자의 입력을 변수로 받을 수 있다.
! TIP
! TIP
select 도 있다. 그 예시는 조금있다가 다시한번 살펴보자
read var 에 부가적으로read -s var 을 하면 패스워드 칠 때처럼타이핑하는게 화면에 보이지 않음 (패스워드용)
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (4) if 구문
if [ 조건문 ]then 문장 exitelif [ 조건문 ]then 문장 exitelse 문장fi
ANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (5) 비교문
[ $A -gt $B ] : A가 B보다 크다[ $A -lt $B ] : A가 B보다 작다[ $A -ge $B ] : A가 B보다 크거나 같다[ $A -le $B ] : A가 B보다 작거나 같다[ $A -eq $B ] : A와 B가 같다[ $A -ne $B ] : A와 B는 다르다
[주의] : 휠스크립트는 space에 민감하다.
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
직접 해보자ㅋ
ANDR ANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
실습 과제 목표!사용자가 두 숫자를 입력하고, 두 숫자의 크기에 따라 A>B면 “A win!”A<B면 “B win!”A=B면 “Draw!”그 외에는“error”로 표시되게 쉘 스크립트를 만들어보자
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
이상적인 결과
ANDR ANDR
ANDRLINUX
WHEEL SE
SAPZILANDRWHEEL SE 비슷하게 하셨나요?
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (5) 비교문 +
문자비교
[ "$string1" = "$string2" ] : $string1 와 $string2 가 같은가[ “$string1” ! “$string2” ] : $string1 와 $string2 가 다른가[ -z “string” ] : 문자열의 길이가 0인가[ -n “string” ] : 문자열의 길이가 0이 아닌가
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (6) 관계연산자
-a : and-o : or
...그러나 잘 쓰이지 않는다. Why?
ANDRLINUX
WHEEL SE
SAPZIL
&& : 앞의 조건문이 참일 때 실행|| : 앞의 조건문이 거짓일 때 실행
쉘 스크립트 공부 (7) 관계 연산자
쉘 스크립트의 ||, && 관계연산자는 계산횟수를 최소한으로 줄이기 위해서, 왼쪽 값의 계산결과로 인해 굳이 오른쪽 값을 계산할 필요가 없으면 오른쪽 명령을 실행하지 않는 원칙을 갖고 있다.
그러므로 이 원칙을 응용하면 쉘 스크립트를 짤 때, 어떤 명령이 성공적으로 수행될 때만 오른쪽 명령을 수행하게 하거나, 어떤 명령이 실패했을 때 최소한 오른쪽 명령은 수행되게 하는 그런 효과를 낼 수 있다.
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (7) 관계 연산자
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (8) for문
for 변수 in 변수값1 변수값2 변수값3 변수값4 ..do 문장done
파이썬의 for와 비슷하다
! TIP
for i in * : 폴더 안의 파일을 하나씩 가리킨다. $i를 통해 하나씩 이용가능하다.
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (8) for문
ANDRLINUX
WHEEL SE
SAPZIL
쉬어가는겸 실습해보기 추천예제 by 김두현선배
1부터 100까지의 숫자가 input되고 그 실행한 결과를 각각 redi-rection과 pipe를 이용해서 각각 다른 이름의 파일로 저장하도록 한 뒤스크립트 맨 마지막에 그 결과파일을 파싱해서 내가 원하는 하나의 결과파일로 만들어보자
input숫자 실행방법: input숫자를 그 제곱으로 output결과파일 만드는 법: output에‘49’패턴이 있는것만 모아보자
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
쉬어가는겸 실습해보기
이상적인 결과
추천예제 by 김두현선배
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
쉬어가는겸 실습해보기 추천예제 by 김두현선배
ANDR ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (9) while문 until문
while [ 조건문 ]do 문장done
while: 조건문이 참이라면 do와 done 사이 반복until: 조건문이 참이라면 do와 done 사이 반복
until [ 조건문 ]do 문장done
! TIP
‘:’ 와 1은 항상 참을 나타낸다
break와 continue 가능
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
변수 값을 받아들여서, 이 값에 맞는 문장을 실행
쉘 스크립트 공부 (10) case문
case 변수 in 패턴1) 문장 문장;;패턴2) 문장 문장;; esac
! TIP
패턴에 *) 를 사용하면, 모든 예외의 경우를 포함한다
ANDRLINUX
WHEEL SE
SAPZIL
select + while문 + case문 예제
ANDR ANDR
ANDR ANDRLINUX
WHEEL SE
SAPZIL
select + while문 + case문 예제
ANDRLINUX
WHEEL SE
SAPZILANDR쉘 스크립트 공부 (11) 함수
함수이름(){문장}
funcname
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (11) 함수
`RLINUXWHEEL SE
SAPZIL
쉘 스크립트 공부: (12) sed
sed는 대화형 기능이 없는 편집기이다. 일명 streaming 편집기. 명령행에서 직접 편집 명령어와 파일을 지정, 작업 후 결과를 화면으로 확인.sed 편집기는 원본을 손상하지 않는다. 리다이렉션을 이용하여 편집 결과를 파일로 저장하여 확인할 수 있다.
이근홍 선배님 “sed를 알면 스크립팅에 극적인 진보가 일어날텐데 시간나면 알아 놓으세요.”
추천 링크 http://hyunkie.tistory.com/51 http://goo.gl/CStrFX
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립트 공부 (13) 종료
exit
(쉘 명령어의 경우): shell을 종료한다(쉘 스크립트의 경우): 실행중인 표현문 종료
종종 exit 0 이나 exit 1 을 볼 수 있다뒤에 붙은 숫자가 exit status로 그 스크립트의return 값이 참인지 아닌지를 알려준다
ANDRLINUX
WHEEL SE
SAPZIL
쉘 스크립 트 공부 (13) 종료
ANDRLINUX
WHEEL SE
SAPZILANDR쉘 스크립트 공부 (13) 종료
하지만 우리 세미나는 아직 exit아님
CHOCHO
ANDRLINUX
WHEEL SE
SAPZIL
SHELL SCRIPT & CRON
ANDR ANDRLINUX
WHEEL SE
SAPZIL
크론이란?
ANDRLINUX
WHEEL SE
SAPZIL
크론은 crontab에 입력한 명령을 기반으로 일정에 따라 계획한 작업을 실행하는 데몬입니다.
. 예약실행 같은 것!
. UNIX/Linux의 자동 스케쥴러 시스템
. 정기적 백업작업에 사용사용자가 직접 제어하지 않고 백그라운드에서 돌면서 여러 작업을 하는 프로그램
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
크론 실행시키기
시작: /etc/init.d/cron start 또는 service cron start
종료: /etc/init.d/cron stop 또는 service cron stop
재시작: /etc/init.d/cron restart 또는 service cron restart
실행 되고 있나 확인: ps aux | grep cron
cron이 실행될 때 /var/spool/cron/crontabs 에 현재 사용자가 지정한 crontab이 있는지를 참조
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
Crontab ㆍCron table의 약자 ㆍCron에게 언제 무슨 command를 실행시켜라! 하고 알려준다 ㆍCrontab은 크론 작업 목록의 이름이기도 하며 편집할 목록에 있는 명령의 이름이기도 합니다.
/etc/crontab: 시스템의 cron 설정파일
/var/spool/cron/crontabs 에 username으로 저장된다 - 실습 서버에서 user권한으로는 접근 불가 sudo -s 써서 root권한으로 확인 가능
(크론탭)이란?
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
Crontabcrontab -e: 내용 작성 및 수정
crontab -r: 내용 삭제
crontab -l: 현재 내용 출력
crontab [filename]: [filename]으로 crontab 변경
crontab -u [username] -l: 다른 사용자의 crontab 목록 보기
ANDRLINUX
WHEEL SE
SAPZIL
/etc/crontab/var/spool/cron/crontabs
ANDRcrontab을 설정할 때 쓰는 두가지 코드:1. vi /etc/crontab - /etc/crontab을 설정 (시스템 전체)
2. crontab -e - /var/spool/cron/crontabs 에 소유주 이름으로 저장
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
Crontab 설정
/etc 폴더에 보면 cron.daily, cron.hourly, cron.monthly, cron.weekly 라는 하위 폴더들이 있다
shell script 파일을 이 폴더들 안에 넣어 설정할 수도 있다
ANDRANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
Cron 환경변수SHELL: cron이 돌아가는 shell; 기본값 /bin/shEDITOR: 편집기; 기본값 vimPATH: cron에 쓰일 프로그램을 탐색할 경로HOME: cron에 쓰일 홈 디렉토리LONGNAME: crontab의 소유주MAILTO: 출력을 받아볼 이메일
ANDRANDR
ANDRWHEEL SE
ㆍCron table의 약자 ㆍCron에게 언제 무슨 command를 실행시켜라! 하고 알려준다 ㆍCrontab은 크론 작업 목록의 이름이기도 하며 편집할 목록에 있는 명령의 이름이기도 합니다.
/etc/crontab: 시스템의 cron 설정파일
/var/spool/cron/crontabs 에 username으로 저장된다 - 실습 서버에서 user권한으로는 접근 불가 sudo -s 써서 root권한으로 확인 가능
ANDRLINUX
WHEEL SE
SAPZIL
Cron 명령어 문법
[MM] [HH] [DD] [mm] [d] [username] [command]
MM 분 (0~59)HH 시 (0~23)DD 일 (1~31)mm 월 (1~12)d 요일 (0~7) * 0과 7은 일요일을 뜻함command 실행할 명령어숫자 대신 *를 넣으면 그 조건은 패스
TIP
d 다음에 year가 오기도 하지만 일반적으로 생략가능
username은 /etc/crontab 에선 필수.crontab -e 는 필수아님
ANDRLINUX
WHEEL SE
SAPZIL
Cron 명령어 예시
30 05 * * * cron.sh# 매일 05시 30분에 cron.sh 실행
* */1 * * * rm -f /var/log/*# 1시간 마다 로그를 삭제
* 15, 17 * * * cron.sh# 15시, 17시에 매 분마다 cron.sh 실행
! TIP
* = 계속 (매분, 매시, 매일, 매달, 매주)
/ = 마다 (*/1 = 1분마다, 1시마다 …)
ANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
Putty에서 실행시키기
ANDRANDR
ANDRWHEEL SE
ANDRANDR
ANDRLINUX
WHEEL SE
SAPZIL
Putty에서 실행시키기
ANDR
ANDRLI`WHEEL SE
SAPZIL
Cron output
별다른 redirection을 해주지 않으면 command의 output은 그 crontab의 주인에게 메일로 발송된다 (환경변수 MAILTO 에 따로 설정이 되어있으면 그 주소로 발송)
ANDRANDR
ANDRLINUX
WHEEL SE
SAPZILANDRWHEEL SE Putty에서 실행시키기
하지만 redirect 시키면?
?WHY?
cron에서 시스템 명령어 (ls, mv, cd 등) 이외에는 절대경로를 사용한다.
왜?
ANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
크론은 절대경로로!
ANDRcron은 시스템에 기본적으로 설치되어져 root에게만 권한이 주어지기 때문에 ls, mv, cd같은 시스템 명령 이외에는 절대경로로 입력해 줘야 한다
ANDR
ANDRLINUX
WHEEL SE
SAPZIL
미리 정의된 키워드들
@yearly, @annually : 매년 1월 1일 자정에 실행@monthly : 매달 1일 자정에 실행@weekly : 매주 일요일 자정에 실행@daily : 매일 자정에 실행@hourly : 매시 정각에 실행@reboot : 부팅되었을 때 실행
ANDRANDR
ANDRLINUX
WHEEL SE
SAPZIL
Crontab permission
ANDRWHEEL SE
/etc/cron.allow & /etc/cron.deny ㆍ cron.allow가 존재하고 목록에 있는 사용자는 crontab 사용 가능ㆍ cron.deny가 존재하고 목록에 있는 사용자를 제외, crontab 사용 가능 - 둘 다 존재하지 않으면 root만 사용 가능 - 처음엔 존재하지 않으므로 필요시 생성하세요!
ㆍ cron.allow와 cron.deny 둘 다에 같은 유저가 있으면 cron.allow가 먼저 consider되어 사용 가능
ANDRANDR
ANDRLINUX
WHEEL SE
SAPZIL
Anacron
ANDRWHEEL SE
ㆍ 데몬이 아니라 크론과 같이 동작하는 프로그램ㆍ 24시간 켜져 있지 않은 서버/PC에서, 일 이상의 간격으로 정해진 작업을 수행할 때 사용ㆍ /etc/anacrontab 에서 수행할 작업 리스트를 불러옴.ㆍ 수행 시간에 꺼져 있어 수행되지 않았던 작업을 켜졌을 때 작업
ANDRLINUX
WHEEL SE
SAPZIL
THANK YOU
ANDR
ANDRWHEEL SE
ANDRLINUX
WHEEL SE
SAPZIL
참조2011 Rodumani(정창제)2012 differ(박지민)2012 argon(김두현)-http://gongdoo.tistory.com/241-http://blog.naver.com/kangminser88/220050112192-http://stackoverflow.com/questions/7328223/unix-export-command-http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm-http://wiki.gentoo.org/wiki/Cron/ko#.ED.81.AC.EB.A1.A0.ED.83.AD_.ED.8E.B8.EC.A7.91