날짜별 글 목록: 2014년 6월 24일

bash의 잘 알려지지 않은 기능 7가지

참조 원문 : 7 hidden features of bash

1. 이전 명령어 다시 실행
  sudo를 사용 안 하고 root 권한이 필요한 명령어를 했을 때 아주 유용한 기능. 파라미터로 !! 를 입력하면 마지막으로 실행했던 명령어를 반복한다. 예를 들어 apt-get 명령어를 사용했는데 sudo를 쓰지 않아서 앞에 sudo를 붙여 다시 실행해야 하다면 sudo !! 라고 실행한다.

2. bash 스크립트
bash -n bashscript.sh  ->  실제로 스크립트를 실행하지 않고 문법만 검사.
bash -x bashscript.sh  ->  디버그 모드로 스크립트 실행. 각 명령어와 그 결과를 단축하여 출력.

3. 이전 명령어의 특정 문자열을 치환
  ^이전문자열^새문자열^ 문법으로 달성할 수 있다.

$ sudo apt-get install wrongpackagename
$ ^wrongpackagename^rightpackagename^
sudo apt-get install rightpackagename

  sed나 vi와 비슷한 다른 방법도 있다.

$ sudo apt-get install wrongpackagename
$ !!:s/wrongpackagename/rightpackagename
sudo apt-get install rightpackagename


4. 이전 줄의 마지막 파라미터 사용
  가끔 명령어에서 긴 파라미터를 썼는데 그걸 또 써야 할 때가 있다. 예를 들어 어떤 디렉토리를 만들고 그 디렉토리로 이동하려고 할 때 아래와 같은 방법으로 이동할 수 있다.

# mkdir -p /this/is/mylong/pathto/some/directory
# cd $_

  $_는 마지막에 사용했던 명령어의 마지막 파라미터를 뜻한다. 그 이전 명령어들의 마지막 파라미터를 사용하고 싶다면 ‘Alt + .’ 단축키를 사용하면 된다. 이 단축키를 사용하면 마지막 파라미터를 출력하며, 한 번 더 누를 때마다 그 이전 명령어의 마지막 파라미터를 출력한다.

5. 지금 있는 디렉토리에서 하위 디렉토리만 출력

ls -d */

  -d 옵션은 디렉토리 엔트리만 보여주는 옵션이지만 파라미터를 입력하지 않으면 현재 디렉토리를 파라미터로 사용하기 때문에 ‘.’만 나온다.

6. 예전 명령어 검색
  ‘Ctrl + r’을 누르면 예전에 사용한 명령어를 검색할 수 있다. Ctrl + r을 누르고 타이핑을 치면 입력한 모든 텍스트를 포함하고 있는 명령어들 중 가장 최근에 사용한 것을 보여주며 Ctrl + r을 누를 때마다 더 오래된 명령어를 보여준다. 만약 지나쳤다면 Ctrl + s를 눌러 앞으로 검색하면 된다.

  하지만 Ctrl + s는 일반적으로 XOFF(interrupt data flow)로 맵핑되어 있는데 현대에는 거의 필요가 없는 기능이므로 stty -ixon 명령어를 통해 맵핑을 끊으면 된다.

7. 길고 복잡고 어려운 명령어를 입력하기 위해 기본 편집기($EDITOR 환경 변수에 설정된 에디터) 즉시 소환
  명령어를 쓰다가 Ctrl + x + e를 누르면 편집기가 실행되면서 쓰던 명령어가 그곳에 적힌다. 편집기에서 명령어를 완성하고 저장 후 종료하면 작성했던 내용이 쉘에서 실행된다.

고가용성 환경에서 cron을 운용하기 위한 rcron

참조 원문 : What is RCRON.. & How to Setup High Availability of cron Jobs Using RCRON

  HA(High Availability) 환경에서 cron을 사용해보신 분들이라면 이 프로그램이 유용하단 걸 동감하실 수 있으실 겁니다. 서버가 2대 있고 이 2대가 클러스터 구성일 때 액티브 서버에서만 실행되어야 할 cron 스케줄이 있다면 꽤 귀찮은 일이 생깁니다. 액티브와 스탠바이가 바꼈을 때 두 서버의 cron을 수동으로 수정해야 하기 때문이죠. Rcron은 이런 경우에 사용하는 프로그램으로서 구성 서버들 간의 상태를 확인하고 액티브 상태의 서버에서만 지정한 작업을 실행할 수 있게 해줍니다.

  그런데 rcron은 다른 서버의 생존을 파악하는 능력이 없기 때문에 그 역할을 위한 프로그램을 추가로 함께 사용해야 합니다. 이를 위해 이 글에서는 keepalived라는 별도의 데몬을 사용할 것입니다. Keepalived는 상대 노드에 신호를 보내고 응답이 없을 경우 링크가 죽었다고 판단하는 역할을 합니다.

  여기서는 하나의 노드를 keepalived 마스터로 설정하고 다른 한 노드를 keepalived 백업으로 설정할 겁니다. 마스터 노드는 rcron 상태가 액티브로 되며, 백업 노드는 패시브로 설정됩니다. 마스터 노드는 죽을 때 백업 노드에게 0 우선순위 신호를 보내며 이를 받은 백업 노드는 마스터 노드가 되어 rcron을 액티브 상태로 전환합니다. 그러다가 이전의 마스터 노드가 다시 살아나면 마스터 권한을 넘긴 후 백업 모드로 돌아가게 설정할 겁니다.

  설정 환경은 레드햇 계열 배포판인 것으로 가정합니다.


1. /etc/sysctl.conf 파일을 수정하여 두 노드의IP 포워딩 활성화시키기

net.ipv4.ip_forward = 1
# sysctl -p      ; 리부팅 없이 변경사항 적용


2. 두 노드에 EPEL 저장소 추가

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm


3. 두 노드에 필요한 패키지 설치

# yum install subversion byacc flex gcc


4. 프록시 서버를 통해 인터넷 연결을 할 경우 svn에 대한 http_proxy 설정(직접 인터넷 연결을 할 경우 생략)

# mkdir /root/.subversion/
#  vi ~/.subversion/servers
http-proxy-exceptions = *.example.com
http-proxy-host = www.example.com
http-proxy-port = 8080
http-compression = no


5. SVN으로 rcron 설치

# cd /root;
# svn co http://rcron.googlecode.com/svn/trunk rcron
# cd rcron/rcron
# ./configure
# make
# make install


6. 두 노드에 디렉토리 및 설정 파일 생성

# mkdir /etc/rcron/
# vi /etc/rcron/rcron.conf

(1) 마스터 서버 노드
  아래 내용 입력

# An arbitrary name
cluster_name        = cluster

# A file containing either the word “active” or the word “passive”
state_file          = /var/run/rcron/state

# The default state in case state_file can’t be read
#default_state       = active
syslog_facility     = LOG_CRON
syslog_level        = LOG_INFO

# We can tune jobs niceness/priorities
nice_level          = 19

  아래 명령어 실행

# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo “active” > /var/run/rcron/state

(2) 백업 서버 노드
  아래 내용 입력

# An arbitrary name
cluster_name = cluster
# A file containing either the word “active” or the word “passive”
state_file = /var/run/rcron/state
# The default state in case state_file can’t be read
#default_state = passive
syslog_facility = LOG_CRON
syslog_level = LOG_INFO
# We can tune jobs niceness/priorities
nice_level = 19

  아래 명령어 실행

# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo “passive” > /var/run/rcron/state


7. 두 노드에 Keepalive 패키지 설치
(1) 최신 소스 다운로드

# cd /root
# wget http://cgit.luffy.cx/keepalived/snapshot/keepalived-1.2.7.tar.gz

(2) RPM BUILD 패키지 설치

# yum -y install rpm-build

(3) 압축 풀기 및 keepalived.spec.in 파일 수정

# tar -zxvf keepalived-1.2.7.tar.gz
# mkdir -p /root/rpmbuild/SOURCES/
# cp /root/keepalived-1.2.7.tar.gz /root/rpmbuild/SOURCES/
# vi /root/keepalived-1.2.7/keepalived.spec.in
(Version 1.2.2를 Version 1.2.7로 수정)
# yum -y install popt*
# cd /root/keepalived-1.2.7
# rpmbuild -ba keepalived.spec.in

  위 명령어를 사용하면 소스를 이용해 컴파일된 RPM이 /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm라는 경로 및 파일명으로 생성됩니다. 이 파일을 이용해 설치합니다.

# rpm -ivh /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm


8. keepalived 설정
(1) 마스터 노드(172.16.243.144)

# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 101
advert_int 5
vrrp_unicast_bind 172.16.243.144
vrrp_unicast_peer 172.16.243.145

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup “/bin/echo passive > /var/run/rcron/state”
notify_master “/bin/echo active > /var/run/rcron/state”
notify_fault “/bin/echo passive > /var/run/rcron/state”
}

(2) 백업 노드(172.16.243.145)

# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 100
advert_int 5
vrrp_unicast_bind 172.16.243.145
vrrp_unicast_peer 172.16.243.144

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup “/bin/echo passive > /var/run/rcron/state”
notify_master “/bin/echo active > /var/run/rcron/state”
notify_fault “/bin/echo passive > /var/run/rcron/state”
}


9. 두 노드에 실험용 crontab 항목 생성

* * * * * /usr/local/bin/rcron –conf /etc/rcron/rcron.conf echo `date` >> /tmp/output

  두 노드 모두 keepalive 서비스를 시작합니다.

# service keepalived start ; chkconfig keepalived on


10. keepalived 데몬이 죽을 경우에 대비
  아래의 crontab 항목을 추가합니다.

* * * * * * /root/keep-alive-monitor

  그리고 아래 스크립트를 생성합니다.

# vi /root/keep-alive-monitor

#!/bin/sh
echo “test” >> /tmp/monitor;
ps -ef|grep -v grep|grep -i keepalived;
if [ $? -eq 0 ] ; then
exit 0
else
echo “passive” > /var/run/rcron/state;
/etc/init.d/keepalived restart;
fi