블로그 이미지
progh2
지루한 것에서 벗어나 재미난 것 속으로 풍덩~☆

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

Recent Post

Recent Comment

Archive


VMWare에서 데비안을 설치한 후
그 이미지를 외장하드에 넣어서 여러 곳에서 쓰다보면
어느 땐가 갑자기 네트워크가 잡히지 않는 경우를 만나게 된다.

이 경우 나는 레드햇에서 알려진 문제처럼 sysconfi 디렉토리 안에 있는
설정 스크립트를 고치면 되는 줄 알고
데비안에서의 위치를 찾으려 애썼는데...   나올리가 없지 -ㅅ-

원인은 이더넷카드의 식별명?이 바뀌어서 그런 것으로 보인다.
마구 삽질하다 ifconfig -a 를 때리니...     어라?
eth3이라고 하는 녀석이 나타나더라. -_-;;

그래서 /etc/network/interface 파일을 eth3용으로 dhcp로 적절히 수정을 하고
ifup -a 하니 바로 잡혔다. 

우어...  바쁜데 이 삽질을 하느라 1시간을 잡아먹다니!
그래도 답답한 것이 뚫려서 속 시원하다. ㅋ
옛날에도 이런 삽질을 했었다는 기분이 드는 것은 왜일까(...)
posted by progh2
제가 관리하는 과서버에는 SCSC동아리 배창식 선배님이 만드신
자바로된 채팅서버가 돌아갑니다. (소스유실이라 개량불가 -ㅁ-;; )
그런데 기본적으로 매번 수동으로 껐다 켜주어야 했기 때문에
종종 일어나는 학교 정전 -_-+ 이 일어나면 한참동안 키는 것을
잊는다던지 하곤 했습니다(..)
그래서, 생각난 김에 /etc/init.d/chatserver 란 파일을 작성해
보았습니다. ( 파일 위치는 데비안 기준입니다.
/etc/init.d/cron 파일을 수정했습니다. ^^; )

혹시 비슷한 경우에 있으신 분은 수정해서 쓰시면 좋을 듯 합니다.
그리고 수정할 부분이나 더 나은 개선점이 있으면 덧글을 남겨 주세요~ =3

ps.
이 파일 작성 후 /etc/rc2 같은 곳에 링크 걸어주어야
실제 해당 런레벨 부팅시 작동한 다는 것을 잊지 마세요~
(별나게도 데비안 사지는 런레벨2가 기본이더군요 -_-a)

[CODE]#!/bin/sh # Start/stop the java chatting server daemon. NAME=chatserver PIDFILE=/var/run/$NAME.pid PORTNUM=44444 JAVA=/usr/local/share/j2sdk1.4.2_01/bin/java PROGDIR=/root/memoting PROG=ChattingServer case "$1" in start) echo -n "Starting java chatting server: chatserver" start-stop-daemon --start -qmb --pidfile $PIDFILE --chdir $PROGDIR --startas $JAVA $PROG $PORTNUM echo "." ;; stop) echo -n "Stopping java chatting server: chatserver" start-stop-daemon --stop -q --pidfile $PIDFILE echo "." ;; restart) echo -n "Restarting java chatting server: chatserver" start-stop-daemon --stop -q --retry 5 --pidfile $PIDFILE start-stop-daemon --start -qmb --pidfile $PIDFILE --chdir $PROGDIR --startas $JAVA $PROG $PORTNUM echo "." ;; *) echo "Usage: /etc/init.d/chatserver start|stop|restart" exit 1 ;; esac exit 0 [/CODE]
posted by progh2

머리가 굳었어~~~ 명령어가 기억이 안나~~~ 삽질이 시작되었어~~~

거금을 주고 지른 리눅스 서버관리 바이블 v2.0 책을
간만에 펼쳐보며 Fedora Core3 설치를 시도해보았습니다.
Fedora Linux는 이전 레드햇 9 이후로 갈라져 나온
레드햇 계열 리눅스로, 뭐 9의 다음 버전 정도로 대충
생각해도 무난합니다. (많은 사회적 차이점 등등이 있지만..)

posted by progh2
putty로 vim에 접속하면 색이 좀 어둡게 나와서 주석같은 것은 거의 알아 볼 수 없었습니다.
그래서 어떻게 할까 해서 찾아봤는데..

http://bbs.kldp.org/viewtopic.php?t=28285&highlight=vim+%BB%F6%B1%F2

에서 :colo ron 라는 옵션을 발견하게 되서 적용하니 원츄!!

vim 설정 추가는 그냥 쉘상에서 아래 명령을 때려주면 끝!
[CODE]echo "color ron" >> ~/.vimrc[/CODE]

암울한 기본화면 :colo default


보기좋은 :colo ron


쓰는김에 내 .vimrc 설정 공개!
(language-env 설정이 대부분이지만.. ^^;; )
[CODE][07/23_10:33][progh2@aged:~]$ cat .vimrc " ---- language-env DON'T MODIFY THIS LINE! """ ======================================================== """ 기본적인 설정들 """ ======================================================== set nocompatible " Vim 디폴트 기능들을 사용함 set backspace=2 " 삽입 모드에서 백스페이스를 계속 허용 set autoindent " 자동 들여쓰기 set cindent " C 언어 자동 들여쓰기 set smartindent " 역시 자동 들여쓰기 set textwidth=76 " 76번째 칸을 넘어가면 자동으로 줄 바꿈 set nowrapscan " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음 "set nobackup " 백업파일을 만들지 않음 set novisualbell " 비주얼벨 기능을 사용하지 않음 set nojoinspaces " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔 set ruler " 상태표시줄에 커서 위치를 보여줌 set tabstop=4 " <Tab> 간격 set shiftwidth=4 " 자동 들여쓰기 간격 "set keywordprg=edic " K를 눌렀을 때 실행할 명령어 set showcmd " (부분적인) 명령어를 상태라인에 보여줌 set showmatch " 매치되는 괄호의 반대쪽을 보여줌 set ignorecase " 찾기에서 대/소문자를 구별하지 않음 set incsearch " 점진적으로 찾기 set autowrite " :next 나 :make 같은 명령를 입력하면 자동으로 저장 set title " 타이틀바에 현재 편집중인 파일을 표시 """ ======================================================== """ 파일 인코딩을 한국어로 설정 """ ======================================================== if $LANG[0] == 'k' && $LANG[1] == 'o' set fileencoding=korea endif """ ======================================================== """ 터미널에 따른 설정 : Xterm이면 16컬러 사용 """ ======================================================== if &term =~ "xterm-debian" || &term =~ "xterm-xfree86" set t_Co=16 set t_Sf=^[[3%dm set t_Sb=^[[4%dm set t_kb fixdel endif """ ======================================================== """ 문법 강조기능 사용 """ ======================================================== if has("syntax") syntax on endif """ ======================================================== """ GUI 모드로 실행할 경우 """ ======================================================== if has("gui_running") set visualbell " 비주얼벨 기능 사용 set hlsearch " 찾는 단어를 하이라이팅 set guifontset=-*-fixed-medium-r-normal--14-*-75-75-*-70-iso8859-1,-*-gulim-medium-r-normal--14-140-75-75-*-140-ksc5601.1987-0 endif " ---- language-env end DON'T MODIFY THIS LINE! colo ron set number[/CODE]
posted by progh2
here documents - 실제로 스크립트로부터 입력을 받아들이고 있는 동안 명령이나 파일이나 키보드로부터 읽어들이는 것처럼 실행되게 해준다. << 는 쉘의 레이블 재지정자이고, 명령의 입력이 here document가 되도록 한다. 그리고 그 뒤의 특별한 문자들은 here document가 시작하고 끝나는 것을 알려주기 위한 표식이다.
[CODE]#!/bin/sh cat << !FUNKY! hello this is here document !FUNKY![/CODE]

스크립트 디버깅 - 쉘 옵션을 통한 디버깅
※ 명령 라인 옵션 , set 옵션 (같은 의미)
[CODE]형식 에러만을 확인한다.(명령을 실행하지는 않는다.) 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[/CODE]
-o 옵션을 사용하여 set 옵션 플래그를 설정하고, +o를 사용해 취소할 수도 있다. 또한 PS4 값을 변경하면 xtrace 플래그인 '+'를 다른 의미있는 것으로 변경할 수도 있다.
# 색이 들어간 + 로 바꾸기
PS4="[?33[1;32m]+[?33[0;37m] "
posted by progh2
expr - 인수를 수식으로 평가.
| & = > < >= < <= != + - * / % 등을 사용 가능하나 $((..))를 더 많이 쓴다.
x='expr $x + 1'
printf - 최신 쉘에서만 유용한 약간 c보다는 제한있는 형식화된 출력
이드케이프 시퀀스
\ 역슬래시 문자
a 경고(벨이나 경고음)
? 백스페이스 문자
f 폼피드 문자

새 줄 문자

개행문자
탭문자
v 수직 탭문자
변환지정자(conversion specifier)
%d 10진수 툴력
%c 문자 출력
%s 스트링 출력
%% %%문자 출력
$ printf "%s %d %s
" "Hi There" 15 people
Hi There 15 people
return- 함수의 반환 지정. 생략하면 마지막 명령의 종료코드를 반환

set - 쉘을 위한 파라미터 변수 설정
[CODE]#!/bin/sh # set.sh echo the date is $(date) set $(date) echo The month is $2 exit 0[/CODE]
shift - 모든 파라미터 변수를 한 단계 아래로 이동.
스크립트가 10개 이상의 파라미터를 요구할 때 10번째 이상의 파라미터를 이용하기 위해 shift가 필요하게 된다.
[CODE]#!/bin/sh while [ "$1" != "" ]; do echo "$1" shift done exit 0[/CODE]
trap - 시그널(signal) 받아들일 때 수행동작 지정
흔한 용도는 인터럽트가 발생할 때 스크립트를 정리하는 것이다. trap 명령에는 수행할 동작과 가로챌 시그널 이름이 전달된다.
시그널에 익숙하지 않다면 프로그램에 비동기적으로 전달되는 이벤트로 생각할 수 있다. 기본적으로 이것은 대개 프로그램이 종료하게 된다
trap command signal
trap 조건을 기본값으로 재설정 하기 위해서는 단순히 명령을 - 로 지정하면 된다. 시그널을 무시하기 위해서는 명령을 비 스트링 ' '으로 설정한다.
시그널 - 설명
HUP(1) - Hang up. 일반적으로 터미널이 회선에서 사라지거나 사용자가 로그아웃 할 때 전달된다.
INT(1) - Interrupt. 일반적으로 키를 눌러 전달한다.
QUIT(3) - Quit. 일반적으로 키를 눌러 전달한다.
ABRT(6) - Abort. 일반적으로 몇 가지 심각한 실행 에러의 경우에 전달.
ALRM(14) - Alarm. 일반적으로 시간 경괄르 다루기 위해 사용.
TERM(15) - Terminate. 시스템이 종료될 때 시스템에 의해 전달

[CODE]#!/bin/sh trap "rm -f /tmp/my_tmp_file_$$" INT echo "creating file /tmp/my_tmp_file_"$$ date > /tmp/my_tmp_file_$$ echo "press interrup (CTRL-C) to interrup ..." while [ -f /tmp/my_tmp_file_$$ ]; do echo "File exists" sleep 1 done echo "The file no longer exists" trap - INT echo "creating file /tmp/my_tmp_file_"$$ date > /tmp/my_tmp_file_$$ echo "press interrup (control-C) to interrupt ..." while [ -f /tmp/my_tmp_file_$$ ]; do echo "File exists" sleep 1 done echo "We never get here" exit 0[/CODE]
unset - 환경으로부터 변수나 함수 제거. 그러나 쉘 자체에 의해 정의된 읽기 전용 변수를 대상으로 할 수는 없다.
명령 실행 - 명령을 실행하고 명령의 출력 결과를 저장할 때 사용
$(command) 또는 `command`
변수 확장에 대해 보호하기 위해 앞의 쉘인용에서 명령실행의 "오래된 형식"으로 역 따옴표 `` 가 쓰였다. 이 형식은 매우 이식성 있어야 하는 쉘 스크립트에서만 사용하기 바란다.

표준 출력에서 명령의 출력 결과인 파라미터들을 변환하려고 하고, 이것을 프로그램의 인수로 사용하고자 하는 경우가 있다면, 명령 xargs를 사용하면 된다.
[CODE]#!/bin/sh echo "The current users are $(who)" result=$(ls | xargs cat) echo $result exit 0[/CODE]
산술확장 - expr명령은 처리하기 위해 새로운 쉘을 호출해야 하므로 느리다. 따라서 expr보다 나은 $((...)) 확장을 많이 사용한다.
[CODE]#!/bin/sh x=0 while [ "$x" -ne 10 ] ; do echo $x x=$(($x+1)) done exit 0[/CODE]
파라미터 확장 - 스트링을 파라이터 값 내에서의 대체를 하는 등의 필터
[CODE]#!/bin/sh # 각 루프에서 i의 값은 실제 파일 이름을 제공하기 위해 ${i}로 대체. for i in 1 2 ; do my_secret_process ${i}_tmp done[/CODE]
흔히 사용되는 파라미터 확장들
${param:-default} param이 널이면 이것을 default값으로 제공 (param값은 불변)
${param:+default} param이 존재하고 널이 아니면 default를 반환(param값은 불변)
${param:=default} param이 널이면 default값을 대입(param값 변함)
${#param} param의 길이를 제공
${param%word} 끝에서 word에 일치하는 param의 가장 작은 부분을 제거하고, 나머지를 반환한다.
${param%%word} 끝에서 word에 일치하는 param의 가장 긴 부분을 제거하고, 나머지를 반환한다.
${param#word} 처음부터 word에 일치하는 param의 가장 작은 부분을 제거하고, 나머지를 반환한다.
${param##word} 처음부터 word에 일치하는 param의 가장 긴 부분을 제거하고, 나머지를 반환한다.

[CODE]#!/bin/sh unset foo echo ${foo:-bar} foo=fud echo ${foo:-bar} foo=/usr/bin/X11/startx echo ${foo#*/} echo ${foo##*/} bar=/usr/local/etc/local/networks echo ${bar%local*} echo ${bar%%local*} exit 0[/CODE]
결과
[CODE]bar fud usr/bin/X11/startx startx /usr/local/etc/ /usr/[/CODE]
posted by progh2
break - for, while, until 루프문 빠져나가기

continue - for, while, until 루프문에서 한회 건너 뛰기

# - 주석

: - 널(null) 명령. 조건문의 논리를 단순화하기 위해 true 대신 사용되기도.
while :
do
...
done

: 구조는 조건적인 변수의 설정에 사용되기도 한다.
아래 내용은 var에 값이 없을경우 value를 대입한다. 앞의 :가 없으면 $var를 명령으로 평가하려고 하기 때문에 :를 써주어야 한다.
: ${var:=value}
이럴 때도 사용하기도 한다.
#!/bin/sh
rm -f fred
if [ -f fred ]; then
:
else
echo file fred did not exist
fi
exit 0

. - 현재 쉘에서 명령 실행
일반적으로 스크립트가 외부 명령이나 스크립트를 실행할 때는 새로운 환경(서브쉘)이 생성되어 새로운 환경에서 실행되기 때문에 그 환경은 부모 쉘로 반환되는 종료코드 외에는 무시되어버린다. 그러나 .명령은 현재 쉘에서 실행된다. 이것은 나중에 실행할 다른 어떤 명령을 위한 환경을 설정하기 위해 스크립트를 '랩퍼(wrapper)'로 사용할 때 종종 유용한데, 예를들면 동시에 여러 프로젝트를 작업중이라면 기존의 프로그램을 다루기 위한 구 버전의 컴파일러를 호출하는 등과 같은 때 사용할 수가 있다.

#!/bin/sh
# classic_set.sh
version=classic
PATH=/usr/local/old_bin:/usr/bin:/bin:.
PS1="classic>"

#!/bin/sh
# latest_set.sh
version=latest
PATH=/usr/local/new_bin:/usr/bin:/bin:.
PS1="latest version>"
$ . ./classic_set
classic> echo $version
classic
classic> . latest_set.sh
latest version> echo $version
latest
latest version>
eval - 인수를 평가하여 변수값의 값을 준다.
[CODE]#!/bin/bash foo=10 x=foo y='$'$x echo $y eval y='$'$x echo $y[/CODE]
exec - 현재 쉘을 다른 프로그램으로 대체
예를들어, 스크립트에서 다음은 현재 쉘을 wall 명령으로 대체할 것이다. 스크립트를 실행중이던 쉘은 더 이상 존재하지 않으므로 스크립트에서 exec 다음의 어떤 문장도 실행되지 않는다.
exec wall "Thanks for all the fish"
exit n - 스크립트가 종료 코드 n을 가지고 종료한다.
종료코드를 지정하지 않고 종료하면, 최종 실행된 명령의 상태가 반환값이 된다. 0은 성공을 가르키고, 코드 1부터 125까지는 스크립트에 의해 사용될 수 있는 에러코드이다. 즉 125개의 사용자 정의 에러코드를 사용가능한 것이다. 나머지 값은 이미 예약된 의미를 가진다.
종료코드 설명
126 파일이 실행 가능하지 않았다
127 명령이 발견되지 않았다.
128 이상 시그널이 발생했다.
export - 파라미터로 지정된 변수를 서브 쉘에서 유효하게 만든다.
export 명령은 파라미터로부터 환경 변수를 생성하는데 이 변수는 현재 프로그램이 호출하는 다른 스크립트와 프로그램에서 사용할 수 있다. 기술적으로 표현하면 익스포트된 변수는 쉘로부터 파생되는 어떤 자식 프로세스에서 환경 변수를 형성한다.
[CODE]#!/bin/sh # export2.sh echo "$foo" echo "$bar"[/CODE]
[CODE]#!/bin/sh # export1.sh foo="The first meta-syntatic variable" export bar="The second meta-syntatic variable" ./export2.sh[/CODE]

실행결과
$ ./export1.sh

The second meta-syntatic variable
$
명령 set -a나 set -allexport는 모든 변수를 export한다.
[CODE]#!/bin/sh # export3.sh set -a foo="The first meta-syntatic variable" export bar="The second meta-syntatic variable" ./export2.sh[/CODE]
실행결과
$ ./export3.sh
The first meta-syntatic variable
The second meta-syntatic variable
$
posted by progh2
쉘 프로그래밍 - 함수, 내장명령, 명령결과, heredocument
함수
[CODE]function_name () { statements }[/CODE]
함수를 호출하기 위해서는 항상 함수를 먼저 정의해야 한다. 함수가 호출될 때 스크립트의 위치 파라미터 $*, $@, $#, $1, $2 ... 등은 함수에 대한 파라미터에 의해 대체된다. 이게 함수로 전달된 파라미터를 읽어들이는 방법이며 함수가 끝날 때 이전 파라미터로 값이 복원된다. 또한 return 명령을 사용하여 함수가 숫자값을 반환하게 할 수 있다. 함수가 스트링을 반환하게 하는 일반적인 방법은 함수가 끝난 후에도 사용할 수 있도록 스트링을 변수에 저장하게 하는 방법이 있다.
[CODE]#!/bin/bash foo() { ls -al asd * return } result=$(foo) for keyword in $result do echo $keyword done[/CODE]
결과
[CODE]ls: asd: 그런 파일이나 디렉토리가 없음 -rwxr-xr-x 1 progh2 progh2 25 7월 18 19:34 a.sh -rwxr--r-- 1 progh2 progh2 304 7월 18 21:54 andor.sh [/CODE]
local variable
local 키워드를 사용하면 전역변수와 별개의 지역변수를 쓸 수 있다.
[CODE]#!/bin/sh sample_text="global variable" foo() { local sample_text="local variable" echo "function foo is executing" echo $sample_text smaple_text="also this is local variable" echo $sample_text } echo "script starting" echo $sample_text foo echo "script ended" echo $sample_text exit 0[/CODE]
파라미터 전달 예
yes_or_no 로 파라미터를 넘기는 것과 넘겨진 것의 변화를 살펴본다. 또한 함수의 반환값을 if에 사용한 것도 주의.
[CODE]#!/bin/bash yes_or_no() { echo "Is your name $* ?" while true do echo -n "Enter yes or no: " read x case "$x" in y | yes ) return 0;; n | no ) return 1;; * ) echo "Answer yes or no" esac done } echo "Original parameters are $*" if yes_or_no "$1" then echo "Hi $1, nice name" else echo "Oh, never mind." fi exit 0[/CODE]
posted by progh2
prev 1 2 next