[Linux] 내장변수 & Exit Code 정리

자주 사용하고 친숙? 하지만 매번 기억이 나질 않는..

그 녀석들 저장해둡니다.

 

Shell 내장변수
$$ : 
해당 프로세스의 PID
$? : 
가장 최근에 실행한 명령의 종료값
$# : 
프로그램에 전달된 인수의 개수
$0 : 
명령수행시 명령의 이름을 기억하는 변수값
$n : 
전달된 n번째 인수(ex:$1,$2)
$* : 
전달된 인수들 전체를 하나의 문자열로 표시함
$@ : 
전달된 인수들 전체를 문자열의 목록으로 표시함
$! : 
마지막으로 실행된 백그라운드 프로세스 pid

 

 

Shell exit code  ( 내장변수 $? 에 저장되어 다음 쉘에서 활용가능 )

  0 : Successful completion of the command
1 : General unknown error
2 : Misuse of shell command
126 : The command can’t execute
127 : Command not found
128 : Invalid exit argument
128+x : Fatal error with Linux signal x
130 : Command terminated with Ctrl-C
255 : Exit status out of range

[linux] jq 1.5 release – build RPM

jq 란 ?

lightweight and flexible command-line JSON processor.

api 호출등에 데이터를 주고받는데 있어, 최근 json포멧을 사용하는 경우가 많습니다.

커멘드라인을 이용해서 curl등의 도구를 이용해서 데이터를 가져오는 경우 해당 데이터를 json 포멧등으로 (일반적으로 pretty form) 변환 하거나 sed, awk , grep 등 다양한 데이터 파싱이 가능한 도구입니다.

 

최근 …(이래도 2015년 8월 15일) 1.5버전이 릴리즈 되어 있으니, 이걸 RPM 으로 빌드하고, 사용해봅시다.

 

 

https://stedolan.github.io/jq/download/

최신버전 1.5를 빌드 하기 위해 해당 사이트를 방문하여 최신버전의 소스 파일을 다운 받습니다.

 

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz

 

SPEC 생성

빌드뤼카이어, valgrind 설치

1.5 버전 에서   bison 3.0이하의 버전에서는 아래와 같이 컨피그 옵션을 수정합니다.
빌드 하는 환경은 cent6 이므로, 2.7 버전이 설치되어 있습니다.

./configure –disable-maintainer-mode

 

추가로 make check 가 진행될 때 setup.sh 에서 참조하는 것중

PASS: tests/mantestPASS: tests/jqtestFAIL: tests/onigtestPASS: tests/shtest

 

위에 onigtest 가 실패하는 것은  테스트 작업 설정시 oniguruma.h 를 참조하기 때문인데요.

이는 setup.sh를 수정하여 리패키징 하거나, oniguruma-devel 패키지를 설치하여, 해당 해더를 위치시킨후 처리가능합니다.

 

또한 1.5서 추가되는 라이브러리 패스가 추가되어 https://github.com/stedolan/jq/blob/master/jq.spec 처럼 %{_libdir} 을 추가할 필요가 있습니다.

 

 

rpm 명세서.

Name:           jq

Version:        1.5

Release:        1%{?dist}

Summary:        Command-line JSON processor

License:        MIT and ASL 2.0 and CC-BY and GPLv3

URL:            http://stedolan.github.io/jq/

Source0:        http://stedolan.github.io/%{name}/download/source/%{name}-%{version}.tar.gz

BuildRequires:  flex

BuildRequires:  bison

%ifarch %{ix86} x86_64

BuildRequires:  valgrind

%endif

%description

lightweight and flexible command-line JSON processor

 jq is like sed for JSON data – you can use it to slice

 and filter and map and transform structured data with

 the same ease that sed, awk, grep and friends let you

 play with text.

 It is written in portable C, and it has zero runtime

 dependencies.

 jq can mangle the data format that you have into the

 one that you want with very little effort, and the

 program to do so is often shorter and simpler than

 you'd expect.

%prep

%setup -qn %{name}-%{version}

%build

%configure --disable-maintainer-mode

make %{?_smp_mflags}

# Docs already shipped in jq's tarball.

# In order to build the manual page, it

# is necessary to install rake, rubygem-ronn

# and do the following steps:

#

# # yum install rake rubygem-ronn

# $ cd docs/

# $ curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3

# $ source $HOME/.rvm/scripts/rvm

# $ bundle install

# $ cd ..

# $ ./configure

# $ make real_docs

%install

make DESTDIR=%{buildroot} install

%check

# Valgrind used, so restrict architectures for check

%ifarch %{ix86} x86_64

make check

%endif

%files

%{_bindir}/%{name}

%{_datadir}/man/man1/jq.1.gz

%{_datadir}/doc/jq/AUTHORS

%{_datadir}/doc/jq/COPYING

%{_datadir}/doc/jq/README

%{_datadir}/doc/jq/README.md

%{_includedir}/jq.h

%{_includedir}/jv.h

%{_libdir}/libjq.a

%{_libdir}/libjq.la

%{_libdir}/libjq.so

%{_libdir}/libjq.so.1

%{_libdir}/libjq.so.1.0.4

%changelog

* Wed Nov 30 2016 Sungho Hong <nic2hong@jinstalk.com> - 1.5-1

- Initial package release for 1.5 jq.

[aws] 호스트 네임 Resolve (reverse resolving hostname) 이슈

VPC 존에 사용중인 인스턴스에 자동으로 할당되는 호스트 명

예시 (ip-10-10-10-10) 의 경우, 해당 도메인을 이용해 서로간에 ip를 리졸빙할 수 있어야하는 경우가 많다.

 

아마존의 경우는 해당 부분은 VPC에서 설정할 수 있으며, 아래와 같이 설정 가능하다.

capture_1027_002

 

 

 

다음은 해당 내용에 대한 사항이다.

http://docs.aws.amazon.com/ko_kr/AmazonVPC/latest/UserGuide/vpc-dns.html

콘솔을 사용하여 VPC에 대한 DNS 지원을 설명하고 업데이트하려면

  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.
  2. 탐색 창에서 [Your VPCs]를 선택합니다.
  3. 목록에서 VPC를 선택합니다.
  4. [Summary] 탭의 정보를 검토합니다. 이 예제에서는 두 가지 모두 사용합니다.
    DNS 설정 탭

 

[linux] mail command 를 이용하여 파일 첨부 발송.

간혹 커멘드 라인을 이용한 메일을 보낼 시 특정 SMTP를 이용하며, 또 파일을 첨부하여 메일을 보내야할 필요가 있습니다.

주로 백업 확인이나, 스케쥴링등에 사용될 것 같은데요. 아래와 같은 커멘드를 이용하시면 됩니다.

 

 

mail -S smtp=mail.jinstalk.com:25 -s “file test by hong” -r noreply@jinstalk.com -v -a ./test.sh nic2hong@jinstalk.com < sungho.txt

 

해당 구문은 ./test.sh 라는 파일을 첨부한 메일을

sungho.txt 라는 파일 내용을 본문으로 하여 메일을 발송해주는 mailx 커멘드입니다.

해당 커맨드는 당연히  mailx 패키지가 설치되어 있어야합니다.

 

AWS S3 bucket Explorer

%ec%8a%a4%ed%81%ac%eb%a6%b0%ec%83%b7-2016-10-21-%ec%98%a4%ed%9b%84-5-38-15

 

git 저장소 : https://github.com/awslabs/aws-js-s3-explorer

S3 내용을 보기 좋게 변환하여, 리스트 형식으로 보여줄 수 있다. 매우 좋은 기능

백업 용도로 S3많이 이용하는데. 누군가에게 보기좋게 가이드하기 편한 방법인 것 같다.

 

해당 깃 프로젝트로 가면 설정방법이 상세하게 있다.

이중 권한 및 cors 설정을 해주면 된다.

방법은 아래와 같다.

 

퍼미션

{

“Version”: “2012-10-17”,

“Statement”: [

{

“Sid”: “PublicListGet”,

“Effect”: “Allow”,

“Principal”: “*”,

“Action”: [

“s3:List*”,

“s3:Get*”

],

“Resource”: [

“arn:aws:s3:::BUCKET-NAME”,

“arn:aws:s3:::BUCKET-NAME/*”

]

}

]

}

 

 

CORS 설정

<CORSConfiguration xmlns=”http://s3.amazonaws.com/doc/2006-03-01/”>  <CORSRule>    <AllowedOrigin>http://BUCKET-NAME.s3.amazonaws.com</AllowedOrigin>    <AllowedMethod>HEAD</AllowedMethod>    <AllowedMethod>GET</AllowedMethod>    <AllowedHeader>*</AllowedHeader>    <ExposeHeader>ETag</ExposeHeader>    <ExposeHeader>x-amz-meta-custom-header</ExposeHeader>  </CORSRule></CORSConfiguration>

 

AWS EIP 서브넷별 고정할당

아마존을 운영하다보면 상태 유지를 위한 오토스케일링으로 desire & Min/Max 수치를 고정하여,

해당 서버를 유지해야 할 필요가 있다.

 

이런 경우, Nat가 아닌 해당 서버의 고정아이피를 할당하는 방법이 필요하게 되어 아래와 같이 스크립트를 진행하게 되었다.

 

상황은 두개의 AZ 에 각각 서버가 위치하고, 인스턴스 헬스체크가 실패하는 경우 신규 인스턴스로 교체 되며, 기존에 사용하던 EIP를 고정적으로 할당하는 방법에 대한 설명이다.

 

#!/bin/bash -ex
## made by hong

# Enable AWS account
export AWS_ACCESS_KEY_ID=”아마존 엑세스 키”
export AWS_SECRET_ACCESS_KEY=”아마존 시크릿 키”

# Availability Zone Elastic IP Azone Bzone DEFINE
EIPA=”서브넷 A에 할당할  EIP아이디 (eipalloc-xxxx1234)”
EIPB=”서브넷 B에 할당할  EIP아이디 (eipalloc-xxxx5678)”

# Get Self Instance infomation
INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e ‘s/.$//’)
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)

if [ “$AZ” == “ap-northeast-1a” ]
then
    aws –region ${REGION} ec2 associate-address –instance-id ${INSTANCEID} –allocation-id ${EIPA}
elif [“$AZ” == “ap-northeast-1b” ]
then
    aws –region ${REGION} ec2 associate-address –instance-id ${INSTANCEID} –allocation-id ${EIPB}
else 
    echo “no define AZ your zone is ${AZ}”
    exit 2
fi

exit 0

 

위와 같은 스크립트가, POST로 실행되도록 설정을 해놓는다.

서버가 배포되면서 해당 스크립트가 실행되면 기존에 제거된 인스턴스에서 반환된 EIP를 다시 고정적으로 받아오게 된다.

Rsync + SSH 키인증 싱크 방식

서비스를 운영하다보면, 22 (SSH) 는 접근이 가능하지만,

Rsync 데몬을 올려 873 (rsync protocol) 을 통해서 받아올 수 없는 경우가 종종 존재한다.

단순 scp는 remote copy를 진행할때 파일에 대한 체크나 비교를 거치지 않고 overwrite를 진행하기때문에, 기존 파일과 싱크를 맞추는 경우보다 더 많은 트래픽이 발생할 수 있다.

 

일반적으로 Rsync 에 SSH 를 이용한 싱크에는 remote host 에 authorized_keys에 퍼블릭 키를 입력하는 경우가 다수였으나,

실제로는 아래와 같은 형태를 통해서 접속이 가능하다.

다음과 같은 명령어를 통해서 ssh의 인증을 획득하여 통신한다.

 

rsync -av -e ‘ssh -i /pathtokey/id_rsa’ user@hongstalk.com:/pathtofile/ /targettofile/

 

 

 

윈도우 쉐어 디렉터리 마운트

2008은 기본 제공된다.

그래서 role 에서 nfs 를 추가한다.

 

그리고 나서 공유하려는 폴더에 properties 를 보면.?  nfs 설정이 된다.

윈도우 주소는 sungho.com 이라고 가정하고 공유 폴더가 share 라면

그럼 리눅스에서

mkdir test/

mount -t nfs sungho.com:/share /test

이렇게 하면 마운트가 된다.

 

/etc/fstab 에서

sungho.com:/share /test nfs 0 0 < 요거 추가해줘야지 안하면 재시작시 날라가요

[linux] 컬러풀하고 사용이 간단한 모니터링 도구 dstat

Dstat 패키지를 설치한다.

패키지가 없으면 여기서 직접 wget 으로 다운받아서 설치하면 된다.

 

http://dag.wieers.com/

 

 

사용법

아래와 같은 형식으로 사용가능하며

dstat [-afv] [options..] [delay [count]]

 

여기서 사용하는옵션들에 대해 간단히 알아보자

 

-c, –cpu  cpu 상태를 모니터링 한다

-C 옵션을 주고 각코어별로 모니터링도 가능하다

ex) -c -C 0,1,2,3,total

-d, –disk disk 상태를 모니터링 한다

-D 옵션을 주고 각디스트별로 모니터링도 가능하다

ex) -d -D sda,sdb,hda,total

-g, –page page 상태를 모니터링 한다

-i, –int  interrupt 상태를 모니터링 한다

-I 5,10 include interrupt 5 and 10

-l, –load  load 상태를 모니터링 한다

-m, –mem  memory 상태를 모니터링 한다

-n, –net  network 상태를 모니터링 한다

-N 옵션을 주고 각 이더넷 인터페이스 별로 모니터링도 가능하다

ex) -n -N eth1,total

-p, –proc  process 상태를 모니터링 한다

-s, –swap  e swap 상태를 모니터링 한다

-S 옵션을 주고 각 SWAP 별로 모니터링도 가능하다

ex) swap1,total

-t, –time    아웃풋 주기와 카운터를 설정하다

-y, –sys  system 상태를 모니터링 한다

–ipc      ipc 상태를 모니터링 한다

–lock      lock 상태를 모니터링 한다

–raw      raw 상태를 모니터링 한다

–tcp      tcp 상태를 모니터링 한다

–udp      udp 상태를 모니터링 한다

 

–output file  CVS현태로 저장되며 파일경로를 설정한다

 

짧게 모니터링을 하고 싶을때는

 

# dstat -f 명령어를 통해서 Full 상태 모니터링을 진행한다.