2. 쉘 문법 - 변수, 연산
3. 쉘 문법 - 조건문,제어구조
4. 쉘 문법 - 목록
5. 쉘 문법 - 함수
6. 쉘 문법 - 명령어
7. 쉘 문법 - 명령실행
8. 쉘 문법 - 쉘 스크립트 내부에서 입력 전달
9. 쉘 문법 - 디버깅
10. 우리가 자주 쓰는 쉘 스크립트
11. 참고자료
1. Shell과 Shell programming이란?
쉘이란 간단히 생각해서 MS-DOS의 명령어 처리기인 command.com과 비슷하다고 할 수
있다. 그렇지만 그 기능은 MS의 것보다 엄청나다고 할 수 있다. 우리가 리눅스를 사용
하면서 쓰고 있는 것들의 대부분이 쉘 스크립으로 짜여있는 것만 봐도 알수 있다.
쉘은 사용자를 유닉스(리눅스) 시스템에 이어주는 인터페이스로써 쉘을 통해 명령어를
입력하면 쉘은 해당 명령을 운영체제가 실행할 수 있도록 전달해주는 역활을 한다.
쉘의 종류는 다양하나 흔히 우리들이 쓰는 것은 bash와 tcsh이다.
+------------+-------------------------------------------------------------+
|셀 명칭 | 간단한 역사 |
+------------+-------------------------------------------------------------+
|sh(Bourne) | 최초의 쉘 |
+------------+-------------------------------------------------------------+
|csh,tcsh,zsh| C 쉘, Berkeley 유닉스 프레임의 Bill Joy가 만듦. |
+------------+-------------------------------------------------------------+
|ksh,pdksh | Korn 쉘, pdksh는 public domain Korn쉘. David Korn이 만듦 |
+------------+-------------------------------------------------------------+
|bash | GNU 프로젝트에서 나온 linux의 중요한 프로그램. Bourne Agine |
| | shell이라도 부른다. |
+------------+-------------------------------------------------------------+
|rc | csh보다 더 C에 가깝다. GNU 프로젝트의 결과물 |
+------------+-------------------------------------------------------------+
쉘 프로그래밍은 빠르고 간편하게 짤 수 있는 인터프리터 언어로써 컴파일할 필요가
없으며 한줄씩 실행시킬 수 있는 장점이 있지만 정밀한 처리나 빠른 처리를 요구하는
것엔 부적합하다고 할 수 있다. 쉘 프로그래밍 작성방법은 두가지로써 하나는 실행할
명령을 순서대로 입력하여 대화식으로 실행하는 것이며, 다른 하나는 실행할 명령을
파일에 저장한 다음 실행하는 것이다.
2. 쉘 문법 - 변수, 연산
변수는 환경변수와 인자변수, 일반변수로 구분되며 변수를 사용하기 위해서는 C와는
달리 처음 선언해주는 것이 아니라 변수를 처음 사용할때 생성한다. 변수는 기본적으
로 문자열로 저장이 되며 변수의 내용을 보려면 $를 앞에 붙인후 echo명령으로 호출하
게 된다.
(변수를 인용처리 하기위해서는 작은 따옴표(')로 $변수를 묶거나 $ 앞에 \문자를 붙
임으로써 $의 특별한 의미를 없애버릴 수 있다. 또한 변수의 값에 공백이 포함되면
앞뒤로 따옴표로 묶어주어야 하며, 등호(=) 앞뒤에 공백을 넣지 말아야 한다)
1) 환경변수
쉘을 기동하면 기본적으로 세팅되는 변수들로써 일반적으로 사용자정의 변수와 구분
하기 위해서 대문자로 표현된다. 핵심적인 변수는 다음과 같다.
+----------+------------------------------------------------------------+
| 환경변수 | 설명 |
+----------+------------------------------------------------------------+
| $HOME | 사용자 홈 디렉토리 |
+----------+------------------------------------------------------------+
| $PATH | 명령어 찾기에 사용되는 콜론(:)으로 구분되는 디렉토리 목록 |
+----------+------------------------------------------------------------+
| $IFS | 입력필드 구분자. 쉘상에서 입력을 읽어들일 때 낱말을 구분 |
| | 하기 위한 목적으로 사용되는 문자 목록, 보통은 스페이스, 탭,|
| | 개행문자임 |
+----------+------------------------------------------------------------+
| $0 | 쉘 스크립트의 이름 |
+----------+------------------------------------------------------------+
| $# | 전달된 인자의 개수 |
+----------+------------------------------------------------------------+
| $$ | 쉘 스크립트의 프로세스 ID. 쉘 스크립트 내부에서 중복되지 |
| | 않는 파일의 이름을 만들 때 자주 사용됨 |
+----------+------------------------------------------------------------+
2) 인자변수
쉘 스크립트에 인자를 넘겨줄때 그 인자들에 대한 정보를 가지고 있는 변수들로써
전달되는 인자와 관련된 변수들은 다음과 같다
+----------+------------------------------------------------------------+
| 인자변수 | 설명 |
+----------+------------------------------------------------------------+
| $1, $2.. | 스크립트로 전달된 인자 |
+----------+------------------------------------------------------------+
| $* | 스크립트로 전달된 인자 전체로, 하나의 변수에 저장되며 IFS |
| | 환경 변수의 첫 번째 문자로 구분된다. |
+----------+------------------------------------------------------------+
| $@ | $*와 비슷하나 IFS 환경 변수를 사용하지 않는다 |
+----------+------------------------------------------------------------+
3) 일반변수
일반변수는 특별한 제약이 없으며 대소문자의 구분만 명확히 하면 된다.
예) #!/bin/sh
echo "This Script Executable File : $0"
echo "Argument Count : $#"
echo "Process ID : $$"
echo "Argument List \$* : $*"
echo "Argument List \$@ : $@"
echo "Argument 1 : $1"
echo "Argument 2 : $2"
-->실행
$chmod 755 argument (or chmod a+x argument)
$./test a1 a2
3. 쉘 문법 - 조건문,제어구조
1) test, []
쉘 스크립트에서 참거짓 값을 판단할 수 있는 것은 test와 []로 보통 같은 의미를
지닌다. []명령어는 쉘 스크립트를 다른 프로그래밍 언어와 비슷하게 보이는 역할
을 하기도 한다.
a. 문자열 비교
+--------------------+--------------------------------------------------+
| 문자열 비교 | 결과 |
+--------------------+--------------------------------------------------+
| string | string1이 빈 문자열이 아니면 참 |
+--------------------+--------------------------------------------------+
| string1 = string2 | 두 문자열이 같다면 참 |
+--------------------+--------------------------------------------------+
| string1 != string2 | 두 문자열이 같지 않다면 참 |
+--------------------+--------------------------------------------------+
| -n string | 문자열이 null이 아니라면 참 |
+--------------------+--------------------------------------------------+
| -z string | 문자열이 null이라면 참 |
+--------------------+--------------------------------------------------+
b. 산술 비교
+-----------------------------+-----------------------------------------+
| 산술비교 | 결과 |
+-----------------------------+-----------------------------------------+
| expression1 -eq expression2 | 두 표현식 값이 같다면 참 |
+-----------------------------+-----------------------------------------+
| expression1 -ne expression2 | 두 표현식 값이 같지 않다면 참 |
+-----------------------------+-----------------------------------------+
| expression1 -qt expression2 | expression1이 expression2보다 크다면 참 |
+-----------------------------+-----------------------------------------+
| expression1 -ge expression2 | expression1이 expression2보다 크거나 |
| | 같다면 참. |
+-----------------------------+-----------------------------------------+
| expression1 -lt expression2 | expression1이 expression2보다 작다면 참 |
+-----------------------------+-----------------------------------------+
| expression1 -le expression2 | expression1이 expression2보다 작거나 |
| | 같다면 참. |
+-----------------------------+-----------------------------------------+
| ! expression | expression이 거짓이라면 참, |
| | 참이라면 거짓 |
+-----------------------------+-----------------------------------------+
c. 파일 조건
+---------------+-------------------------------------------------------+
| 파일 조건 | 결과 |
+---------------+-------------------------------------------------------+
| -d file | file이 디렉토리라면 참 |
+---------------+-------------------------------------------------------+
| -e file | file이 존재한다면 참 |
+---------------+-------------------------------------------------------+
| -f file | file이 정규파일이라면 참 |
+---------------+-------------------------------------------------------+
| -g file | file상에 set-group-id가 설정되어 있다면 참 |
+---------------+-------------------------------------------------------+
| -r file | file이 읽기 가능하다면 참 |
+---------------+-------------------------------------------------------+
| -s file | file의 크기가 0이라면 참 |
+---------------+-------------------------------------------------------+
| -u file | file상에 set-user-id가 설정되어 있으면 참 |
+---------------+-------------------------------------------------------+
| -w file | file이 쓰기 가능하다면 참 |
+---------------+-------------------------------------------------------+
| -x file | file이 실행가능하다면 참 |
+---------------+-------------------------------------------------------+
2) if
명령의 결과를 테스트하여 조건적으로 적절한 구문의 그룹을 실행시킨다.
a. 형식1(단일 if문)
------------------------------------------------------------------------
if [조건]
then
문장
fi
------------------------------------------------------------------------
b. 형식2(if~else문)
------------------------------------------------------------------------
if [조건]
then
문장
else
문장
fi
------------------------------------------------------------------------
c. 형식3(여러가지 조건 검사)
------------------------------------------------------------------------
if [조건]
then
문장
elif [조건]
then
문장
else
문장
fi
------------------------------------------------------------------------
3) for
지정한 범위 안에서 루프를 돌리는데 사용된다. 범위에 사용되는 값은 어떠한
문자열의 집합이라도 가능하다. 루프가 돌때마다 값1, 값2가 차례로 들어간다.
----------------------------------------------------------------------------
for 변수 in 값1, 값2 ...
do
문장
done
----------------------------------------------------------------------------
4) while
어떤 명령을 지정한 횟수만큼 실행시키기에는 부적합한 for루프를 보완하는 것으로
실행 횟수가 불확실할때 편리하다.
----------------------------------------------------------------------------
while 조건문
do
문장
done
----------------------------------------------------------------------------
5) until
while과 비슷하나 조건이 참일동안 실행되는 것이 아니라 거짓일 동안 실행된다.
----------------------------------------------------------------------------
until 조건문
do
문장
done
----------------------------------------------------------------------------
6) select
원하는 리스트를 출력하고 그중 선택된 것을 돌려준다. 주의할 점은 select의 루프
내에서 자동적으로 벗어날 수 없으므로 반드시 break문을 사용해서 벗어나야 한다.
예) #!/bin/sh
echo "What do you like?"
select var in "Linux" "Windows9x" "Win2k" "Win31" "Exit"
do
if [ "$var" = "Linux" ]; then
echo "You are a Linuxer!!!"
exit 0
elif [ "$var" = "Exit" ]; then
echo "The question ended"
exit 1
else
echo "$var is not the best way!!!"
echo "What do you like?"
fi
done
--> 결과 : What do you like?
1) Linux
2) Windows9x
3) Win2k
4) Win31
5) Exit
#?
7) case
여러 패턴을 검사하고 이에 적절한 구문을 실행시켜 주는 것으로 강력한 기능을
가지고 있으며 쉘스크립에 많이 등장한다.
---------------------------------------------------------------------------
case 변수 in
패턴 [ | 패턴 ] ...) 문장 ;;
패턴 [ | 패턴 ] ...) 문장 ;;
....
esac
---------------------------------------------------------------------------
4. 쉘 문법 - 목록
여러 명령어를 실행할때 앞의 명령의 결과에 의해서 다음 행동이 결정되어야 할 경우
AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘 스크립트 뿐 아니라 명
령행에서도 사용 가능하다.
1) AND목록
한번에 여러 명령을 한꺼분에 실행시킬 수 있다. AND 목록에서 이전의 명령이 성공
했다면 다음번 명령을 수행한다. 왼쪽 구문부터 시작하여 그 결과값이 참이라면
그 다음 명령어가 수행된다. 거짓이 반환되면 더이상 명령어를 실행하지 않는다.
----------------------------------------------------------------------------
statment1 && statment2 && statment3 && ...
----------------------------------------------------------------------------
2) OR목록
어떤 하나의 명령의 수행이 성공할때까지 일련의 명령을 계속 수행한다. 명령의 수
행이 성공하면 더 이상 목록 중의 다른 명령은 수행하지 않는다. 왼쪽 구문부터
시작하여 그 결과값이 거짓이라면 오른편의 명령어가 수행된다. 참의 값이 반환되면
실행을 멈춘다.
----------------------------------------------------------------------------
statment1 || statement2 || statement3 || ...
----------------------------------------------------------------------------
3) AND와 OR의 혼용
아래와 같이 &&와 ||을 혼용하여 사용할수 있다. 참이면 문장1이 실행되고 거짓이
면 문장2가 실행된다
----------------------------------------------------------------------------
[ 조건 ] && 문장1 || 문장2
----------------------------------------------------------------------------
예) [ -f file_one ] && command for true || command for false
5. 쉘 문법 - 함수
쉘 스크립 내부에 또는 다른 스크립트 파일에 함수를 정의해 놓고 사용할 수 있다.
함수를 사용하면 코드를 최적화 할 수 있고 코딩이 간결해지며, 재사용이 가능하다.
그러나 다른 스크립트 파일을 호출해서 함수를 실행할 경우, 가능은 하지만 스크립트
의 실행시간이 길어지고 함수의 결과를 전달하는 것이 까다롭기 때문에 가급적이면
외부 파일의 함수를 사용하지 않는 것이 좋다.
-----------------------------------------------------------------------------
function_name () {
statments
}
-----------------------------------------------------------------------------
함수를 사용하는 방법은 함수명(function_name) 뒤에 인자를 적어준다. 그리고 함수
내부에서 지역(local)변수를 사용하고자 할 경우에는 변수명 앞에 local이란 예약어를
적어주면 된다.
6. 쉘 문법 - 명령어
쉘 스크립트 안에서 사용할 수 있는 명령은 두 종류로써 하나는 내부명령어이고 다른
하나는 프롬프트 상에서 실행시킬 수 있는 일반명령어이다. 내부명령이 외부명령보다
좀 더 효율적이라는 것을 제외하면 실질적인 차이는 없다.
1) break
for, while이나 until에서 제어 조건을 만나기 전에 루프를 벗어날 때 사용한다.
예) while true
do
if [ -f file_name ]; then
break
fi
echo "file_name was not found"
done
exit 0
2) : 명령
의미없는(null) 명령으로 true를 대신해 논리값을 간단하게 하기 위해서 사용한다.
while true와 같은 것을 while :와 같이 대체할 수 있으며, 변수의 조건을 지정할
수 있다. 예) : $(var=value)
3) continue
C에서와 비슷하며 for, while 또는 until 루프의 변수를 다음 값을 가지게 하고
다음 번 루프를 돌게 한다.
4) .명령
현재의 쉘에서 명령을 실행시킨다.
5) echo
개행문자를 포함한 문장을 간단하게 출력한다. (다음줄로 넘어간다)
6) eval
인자의 실제 값을 구하는데 사용한다.
예) foo=10
x=foo
y='$'$x
echo $y ==> 결과값 : $foo
foo=10
x=foo
eval y='$'$x
echo $y ==> 결과값 : 10
7) exec
현재 쉘을 다른 프로그램으로 대체하거나 파일을 읽기 모드로 열때 사용한다.
8) exit n
현재 쉘을 종료한다. 종료시 n값을 리턴한다.
+----------+--------------------------------+
| 종료코드 | 설명 |
+----------+--------------------------------+
| 0 | 성공 |
+----------+--------------------------------+
| 1~125 | 스크립트에서 사용하는 에러코드 |
+----------+--------------------------------+
| 126 | 파일이 실행되지 않았다 |
+----------+--------------------------------+
| 127 | 해당 명령을 발견할 수 없다 |
+----------+--------------------------------+
| 128이상 | 시그널이 발생했다. |
+----------+--------------------------------+
9) export
해당 쉘에서 파생된 자식 프로세스에서 export한 환경변수는 본래 쉘에서 관리한다
10) expr
표현식의 값을 구하는 것으로 x='expr $x+1'과 같이 사용된다. 하지만 expr보다는
$((계산식))을 사용한다.
11) printf
C에서의 printf와 흡사하다.
형식 : printf "Format String" arg1 arg2 arg3 ...
+-------------+----------------------------------------+
| 탈출 문자열 | 설명 |
+-------------+----------------------------------------+
| \\ | 백슬래시(\) 문자 |
+-------------+----------------------------------------+
| \a | 경고음(벨 또는 비프음) |
+-------------+----------------------------------------+
| \b | 백스페이스 문자 |
+-------------+----------------------------------------+
| \f | 폼피드 문자 |
+-------------+----------------------------------------+
| \n | 뉴라인(newline) 문자 |
+-------------+----------------------------------------+
| \r | 캐리지 리턴 문자 |
+-------------+----------------------------------------+
| \t | 탭 문자 |
+-------------+----------------------------------------+
| \v | 수직 탭 문자 |
+-------------+----------------------------------------+
| \ooo | 8진수로 표현되는 한 문자 |
+-------------+----------------------------------------+
+-------------+----------------------------------------+
| 변환 식별자 | 설명 |
+-------------+----------------------------------------+
| d | 십진수 출력 |
+-------------+----------------------------------------+
| c | 한 문자 출력 |
+-------------+----------------------------------------+
| s | 문장 출력 |
+-------------+----------------------------------------+
| % | %문자 출력 |
+-------------+----------------------------------------+
예) [lpay09@pay lpay09]$ printf "%s\n" hello
12) return
쉘 함수에서 값을 반환할때 쓰인다.
13) set
쉘 내부에서 매개 인자를 설정한다. set의 인자로 쓰인 문자열은 공백에 의해 $1
부터 차례대로 대입된다.
예) #!/bin/sh
echo the eate is $(date)
set $(date)
echo The month is $2
exit 0
--->결과 : the date is 일 2월 11 02:21:57 KST 2001
The month is 2월
14) shift
쉘의 인자를 한자리씩 아래로(n->1로) 이동시킨다.
예) #!/bin/sh
echo $1
shift
echo $1
shift 5
echo $1
실행 : [lpay09@pay lpay09]$ ./shift 1 2 3 4 5 6 7 8 9 10
1
2
7
15) trap
쉘의 실행도중 시그널을 처리하는 시그널 처리기를 만드는 역할을 한다.
-----------------------------------------------------------------------------
trap command signal
-----------------------------------------------------------------------------
쉘 스크립트는 위에서 아래로 실행되므로 보호하려는 부분 이전에 trap명령을 사용
한다. trap조건을 기본으로 사용하려면 명령에 - 를 넣으면 된다. 신호를 무시할려
면 ''빈 문자열을 준다.
예) trap 'rm -rf /tmp/my_tmp_file_$$' INT
(INT는 보통 Ctrl+C를 눌렀을때 발생된다)
16) unset
변수나 함수를 제거한다.
예) #!/bin/sh
foo="Hello world"
echo $foo
unset foo
echo $foo
7. 쉘 문법 - 명령실행
1) 외부 명령의 실행 결과를 변수에 집어넣어 변수의 값으로 사용하려면 $(command)
구문을 이용하면 된다. 또는 `command`의 형식도 유효하다.
----------------------------------------------------------------------------
변수=$(command)
-----------------------------------------------------------------------------
예) user=$(who)
2) 산술 확장
쉘에 있어서 변수는 모두 문자열로 저장이 되기 때문에 연산을 할려면 다음과 같은
약간 복잡한 거쳐야 된다.
----------------------------------------------------------------------------
변수 = $((산술식))
----------------------------------------------------------------------------
산술식내에는 변수($1,$와 같은)도 들어갈 수 있으며 숫자가 아닌 문자열, 또는
문자열이 담겨있는 변수가 들어가면 그것들은 계산에서 제외된다.
(0으로 간주되어 연산이 이루어지지 않는다)
예) count=$(($count+1))
3) 매개변수 확장
매개변수 확장이란 변수의 값을 문자열 등으로 대체하는 것으로 단순만 대체뿐만
아니라 변수 내의 문자열을 조작하여 원하는 문자열만 추출할 수도 있다.
+------------------+--------------------------------------------------------+
| 매개변수 확장 | 설명 |
+------------------+--------------------------------------------------------+
| ${param -default}| param이 존재하지 않으면 default로 대체 |
+------------------+--------------------------------------------------------+
| ${#param} | param의 길이를 참조한다(가져온다) |
+------------------+--------------------------------------------------------+
| ${param%word} | 끝에서부터 word와 일치하는 parm의 최소부분(첫번째 일치)|
| | 을 제거하고 나머지를 반환한다. |
+------------------+--------------------------------------------------------+
| ${param%%word} | 끝에서부터 word와 일치하는 parm의 최대부분(마지막 일치)|
| | 을 제거하고 나머지를 반환한다. |
+------------------+--------------------------------------------------------+
| ${param#word} | 처음부터 word와 일치하는 parm의 최소부분(첫번째 일치) |
| | 을 제거하고 나머지를 반환한다. |
+------------------+--------------------------------------------------------+
| ${param##word} | 처음부터 word와 일치하는 parm의 최대부분(마지막 일치)을|
| | 제거하고 나머지를 반환한다. |
+------------------+--------------------------------------------------------+
예) #!/bin/sh
unset foo
echo ${foo:-bar}
foo=fud
echo ${foo:-bar}
foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}
foo=/usr/local/etc/local/networks
echo ${foo%local*}
echo ${foo%%local*}
exit 0
--> 결과 : bar
fud
usr/bin/X11/startx
startx
/usr/local/etc
/usr
8. 쉘 문법 - 쉘 스크립트 내부에서 입력 전달 (Here Documents)
쉘 내부에서 명령어에 입력을 전달하는 방법으로 전달된 입력은 마치 키보드에서 입력
한 것과 같이 행동한다.
-------------------------------------------------------------------------------
명령 << 종료문자열
입력값
종료문자열
-------------------------------------------------------------------------------
예) #!/bin/sh
cat << !funy!
Are funy?
I'm a boy.
!funy!
다른 방법으로는 ed에디터와 조합으로 파일을 수정할 수 있다.
예) #!/bin/sh
ed text << !funy!
%s/boy/girl
w
q
!funy!
text파일의 내용 : I'm a boy ---> 실행후 I'm a girl
9. 쉘 문법 - 디버깅
쉘 스크립틀르 디버깅하는 것은 매우 쉽지만 도움이 될만한 특별한 도구가 없다.
따라서 echo문을 사용하여 변수의 내용을 살펴보거나, 문제가 있는 부분을 수동으로
쉘에서 상호 대화식으로 입력하는 테스트를 할 수 있다.
쉘의 명령행 옵션을 사용하거나 set명령을 사용하여 에러를 추적할 수 있다.
+----------------+----------------+--------------------------------------------+
| 명령행 옵션 | set 옵션 | 설명 |
+----------------+----------------+--------------------------------------------+
| sh -n (script) | set -o noexec | 구문 에러만 체크한다. |
| | set -n | 명령을 실행시키지 않는다 |
+----------------+----------------+--------------------------------------------+
| sh -v (script) | set -o verbose | 명령을 실행하기 전에 명령을 에코한다. |
| | set -v | |
+----------------+----------------+--------------------------------------------+
| sh -x (script) | set -o xtrace | 명령행에서 명령을 처리한 다음 에코한다. |
| | set -x | |
| | set -o nounset | 정의되지 않은 변수를 사용했을 때 에러를 |
| | set -u | 출력한다. |
+----------------+----------------+--------------------------------------------+
(set의 옵션 플래그를 켤때는 -o를, 끌때는 +o를 사용한다.)
쉘에서 아래와 비슷한 내용을 스크립트의 처음에 놓으면 어디에서 EXIT 시그널이 발생
해서 종료했는지 확인할 수 있다.
-------------------------------------------------------------------------------
trap 'echo Exiting: critical variable = $critical variable' EXIT
-------------------------------------------------------------------------------
10. 우리가 자주 쓰는 쉘 스크립트 (httpd)
1 : #!/bin/sh
2 : #
3 : # Startup script for the Apache Web Server
4 : #
5 : # chkconfig: 345 85 15
6 : # description: Apache is a World Wide Web server. It is used to server \
7 : # HTML file and CGI
8 : # processname: httpd
9 : # pidfile: /var/run/httpd.pid
10 : # config: /etc/httpd/conf/httpd.conf
11 :
12 : # Source function library.
13 : . /etc/rc.d/init.d/functions
14 :
15 : # See how we were called
16 : case "$1" in
17 : start)
18 : echo -n "Starting httpd : "
19 : daemon httpd
20 : echo
21 : touch /var/lock/subsys/httpd
22 : ;;
23 : stop)
24 : echo -n "Shutting down http : "
25 : killproc httpd
26 : echo
27 : rm -f /var/lock/subsys/httpd
28 : rm -f /var/run/httpd.pid
29 : ;;
30 : status)
31 : status httpd
32 : ;;
33 : restart)
34 : $0 stop
35 : $0 start
36 : ;;
37 : reload)
38 : echo -n "Reloading httpd : "
39 : killproc httpd -HUP
40 : echo
41 : ;;
42 : *)
43 : echo "Usage : $0 {start|stop|restart|reload|status}"
44 : exit 1
45 : esac
46 :
47 : exit 0
1 : #!/bin/sh
2 : #
3 : # functions This file contains functions to be used by most or all
4 : # shell scripts in the /etc/init.d directory.
5 : #
6 : # Version: @(#) /etc/init.d/functions 1.01 26-Oct-1993
7 : #
8 : # Author: Miquel van Smoorenburg,
9 : # Hacked by: Greg Galloway and Marc Ewing
10 : #
11 :
12 : # First set up a default search path.
13 : export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
14 :
15 : # Get a sane screen width
16 : [ -z "$COLUMNS" ] && COLUMNS=80
17 :
18 : # Read in our configuration
19 : if [ -z "$BOOTUP" ]; then
20 : if [ -f /etc/sysconfig/init ]; then
21 : . /etc/sysconfig/init
22 : else
23 : # This all seem confusing? Look in /etc/sysconfig/init,
24 : # or in /usr/doc/initscripts-*/sysconfig.txt
25 : BOOTUP=color
26 : RES_COL=60
27 : MOVE_TO_COL="echo -en \\033[${RES_COL}G"
28 : SETCOLOR_SUCCESS="echo -en \\033[1;32m"
29 : SETCOLOR_FAILURE="echo -en \\033[1;31m"
30 : SETCOLOR_WARNING="echo -en \\033[1;33m"
31 : SETCOLOR_NORMAL="echo -en \\033[0;39m"
32 : LOGLEVEL=1
33 : fi
34 : if [ -x /sbin/consoletype ]; then
35 : if [ "`consoletype`" = "serial" ]; then
36 : BOOTUP=serial
37 : MOVE_TO_COL=
38 : SETCOLOR_SUCCESS=
39 : SETCOLOR_FAILURE=
40 : SETCOLOR_WARNING=
41 : SETCOLOR_NORMAL=
42 : fi
43 : fi
44 : fi
45 :
46 : if [ "$BOOTUP" != "verbose" ]; then
47 : INITLOG_ARGS="-q"
48 : else
49 : INITLOG_ARGS=
50 : fi
51 :
52 : # A function to start a program.
53 : daemon() {
54 : # Test syntax.
55 : gotbase=
56 : user=
57 : nicelevel=0
58 : while [ "$1" != "${1##-}" -o "$1" != "${1##+}" ]; do
59 : case $1 in
60 : '') echo '$0: Usage: daemon [+/-nicelevel] {program}'
61 : return 1;;
62 : --check)
63 : shift
64 : base=$1
65 : gotbase="yes"
66 : shift
67 : ;;
68 : --user)
69 : shift
70 : daemon_user=$1
71 : shift
72 : ;;
73 : -*|+*) nicelevel=$1
74 : shift
75 : ;;
76 : *) nicelevel=0
77 : ;;
78 : esac
79 : done
80 :
81 : # Save basename.
82 : [ -z $gotbase ] && base=`basename $1`
83 :
84 : # See if it's already running.
85 : pidlist=`pidofproc $base`
86 :
87 : pid=
88 : for apid in $pidlist ; do
89 : [ -d /proc/$apid ] && pid="$pid $apid"
90 : done
91 :
92 : [ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && return
93 :
94 : # make sure it doesn't core dump anywhere; while this could mask
95 : # problems with the daemon, it also closes some security problems
96 : ulimit -c 0
97 :
98 : # Echo daemon
99 : [ "$BOOTUP" = "verbose" ] && echo -n " $base"
100 :
101 : # And start it up.
102 : if [ -z "$daemon_user" ]; then
103 : nice -n $nicelevel initlog $INITLOG_ARGS -c "$*" && success "$base
startup" || failure "$base startup"
104 : else
105 : nice -n $nicelevel initlog $INITLOG_ARGS -c "su $daemon_user -c
\"$*\"" && success "$base startup" || failure "$base startup"
106 : fi
107 : }
108 :
109 : # A function to stop a program.
110 : killproc() {
111 : RC=0
112 : # Test syntax.
113 : if [ $# = 0 ]; then
114 : echo "Usage: killproc {program} [signal]"
115 : return 1
116 : fi
117 :
118 : notset=0
119 : # check for second arg to be kill level
120 : if [ "$2" != "" ] ; then
121 : killlevel=$2
122 : else
123 : notset=1
124 : killlevel="-9"
125 : fi
126 :
127 : # Save basename.
128 : base=`basename $1`
129 :
130 : # Find pid.
131 : pidlist=`pidofproc $base`
132 : &nbs
댓글 없음:
댓글 쓰기