사이트 내 전체검색
[linux] 쉘프로그래밍
로빈아빠
https://cmd.kr/server/386 URL이 복사되었습니다.

본문

쉘프로그래밍

목차
1. Shell과 Shell programming이란?
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, <miquels at drinkel.nl.mugnet.org> 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

댓글목록

등록된 댓글이 없습니다.

1,139 (11/23P)

Search

Copyright © Cmd 명령어 3.144.47.115