리눅스 (7)

💻 Programming/Linux

vi 에서 문자열 치환하기

오랜만에 포스팅을 합니다.


뭐, 그냥 종종 사용하는 건데 맨날 까먹어서 계속 구글링하게 만드는 vi에서 문자열 치환하기에 대한 내용입니다.


*nix 환경에서 작업을 하게되면 설정 파일을 수정할 일이 많이 생깁니다.


이때 파일 다운로드 경로나, 이런 저런 경로들을 config 파일 안에 설정해놓고 사용하기도 하는데, 이때 경로 개수가 많고 앞부분의 경로는 동일한 것들이 많을 수 있습니다.


예를들어, /aaa/bbb/myapp/conf/config.properties 파일에 다음과 같은 내용들이 있을 수 있죠.


.

.

myapp.root=/aaa/bbb/myapp

myapp.log=/aaa/bbb/myapp/log

myapp.modules=/aaa/bbb/myapp/modules

.

.


저런식으로 경로가 저장이 되어있는데, 앞부분의 절대경로를 다른 경로로 변경해주고 싶을 때가 있습니다. 파일 사이즈가 작고 4~5개 정도면 하나하나 수정을 해줘도 되겠지만, 파일 사이즈가 크고 경로 설정하는 부분이 여기저기 흩어져 있으면 일일이 찾아서 수정하기가 쉽지 않습니다.


이럴 때 사용하라고 vi에서는 강력한 치환 기능을 제공하고있습니다.


%s/치환하려는문자열정규식/결과문자열정규식/옵션


vi로 문서를 열어놓은 상태에서 :을 입력하여 명령어를 입력할 수 있도록 한 뒤 위 형식에 맞게 문자열 및 옵션을 입력해주면 파일 전체에서 특정 문자열을 찾아서 결과문자열로 변경할 수 있습니다.


위 예를들어 /aaa/bbb/myapp을 /ccc/ddd/app 으로 변경을 하고 싶다면


%s/\/aaa\/bbb\/myapp/\/ccc\/ddd\/app/g


라고 입력해주면 전체 파일의 내용을 검색하여 /aaa/bbb/myapp 문자열을 찾은 뒤 /ccc/ddd/app 으로 치환해줍니다.


명령어를 살펴보면 다음과 같습니다.


%s : 문서 전체

g : 한줄에 동일 패턴이 여러개 존재하는 경우 모두 적용

i : 대소문자 구분 안함




이상으로 간만의 포스팅을 마칩니다~

안녕하세요, 케이치입니다.


오늘은 리눅스 서버의 재부팅/재기동 또는 언제 shutdown이 됐었는지를 확인하는 방법을 배웠습니다.


그다지 많이 쓸 일은 없는 명령어이긴 한데 웹사이트에 접속이 안되서 확인해보다가 알게되었네요.


우선 웹서버로 접속을 하는데 아래와 같은 메시지가 떴습니다.

Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.


뭔소린가 봤더니 점검 중이거나 용량문제로 인해서 접속할 수 없다라는 말이네요.


그래서 서버에 접속해서 혹시 디렉토리 용량이 부족한가 봤는데 아니었습니다.


그럼 왜 안되는지 에러로그부터 확인해야겠죠.


웹서버의 에러로그를 봤는데 에러가 없습니다 ㄷㄷ;;;;; 뭐지 이건;;;


이제 실제 웹앱이 올라가있는 WAS 기동상태를 확인합니다.


두둥!!!! WAS가 죽었네요 ㅜㅜ


뭐지 난 죽인적이 없는데....그래서 다시 WAS의 에러로그를 확인하는데 헐;;;; 여기도 에러로그는 없습니다. 마지막까지 열심히 사람들의 요청에 부응한 흔적밖에 없네요.


뭐지? 서버가 재부팅 됐나? 어떻게 확인하지?


리눅스 서버의 재기동 상태를 확인하는 명령어는 두 가지가 있습니다.


첫째, last 명령어.

둘째, who 명령어.


[keichee@server1 ~]$ last reboot

reboot   system boot  3.10.0-514.16.1. Thu Jun 22 17:13 - 11:32 (140+18:19)

reboot   system boot  3.10.0-327.36.3. Wed Jan  4 22:14 - 17:11 (168+18:57)

reboot   system boot  3.10.0-327.36.3. Thu Nov 17 14:41 - 17:11 (217+02:30)

reboot   system boot  3.10.0-327.36.3. Thu Nov 17 15:06 - 17:11 (217+02:04)

reboot   system boot  3.10.0-327.36.3. Thu Nov 17 11:01 - 17:11 (217+06:09)


last reboot 명령어는 마지막으로 재기동한 시간이 언제인지를 desc 정렬하여 출력합니다. 즉, 제일 위에 있는게 가장 최근에 재기동한 시간을 말합니다.


last reboot 말고도 last shutdown 명령어로 언제 셧다운됐었는지 확인이 가능합니다. 


last -x 는 어떤 사용자가 서버에 접속해서 얼마나 있었는지 확인이 가능합니다. run level이 어떻게 바뀌었는지도 확인이 가능하죠.


[keichee@server1 ~]$ last -x

keichee    pts/0        210.145.229.14   Fri Nov 10 11:09   still logged in

keichee    pts/0        210.145.229.14   Tue Nov  7 09:17 - 14:14  (04:57)

keichee    pts/0        210.145.229.143   Mon Nov  6 09:19 - 18:27  (09:07)

keichee    pts/2        204.130.143.176  Thu Nov  2 22:04 - 00:26  (02:21)

keichee    pts/1        103.170.103.116  Thu Nov  2 22:04 - 00:26  (02:22)

runlevel (to lvl 3)   3.10.0-514.16.1. Thu Jun 22 17:13 - 11:35 (140+18:22)
reboot   system boot  3.10.0-514.16.1. Thu Jun 22 17:13 - 11:35 (140+18:22)
shutdown system down  3.10.0-327.36.3. Thu Jun 22 17:11 - 17:13  (00:01)


그럼 두 번째 명령어였던 who는 어떻게 쓸까요?


기본적으로 who를 쓸 때는 현재 내가 어떤 사용자로 접속을 했는지 확인하기 위해서 사용할 수 있죠.


[keichee@server1 ~]$ who

keichee    pts/0        2017-11-10 11:09 (118.145.269.124)


help 옵션으로 어떤 옵션을 추가로 줄 수 있는지 한번 볼까요?


[keichee@server1 ~]$ who  --help

Usage: who [OPTION]... [ FILE | ARG1 ARG2 ]

Print information about users who are currently logged in.


  -a, --all         same as -b -d --login -p -r -t -T -u

  -b, --boot        time of last system boot

  -d, --dead        print dead processes

  -H, --heading     print line of column headings

  -l, --login       print system login processes

      --lookup      attempt to canonicalize hostnames via DNS

  -m                only hostname and user associated with stdin

  -p, --process     print active processes spawned by init

  -q, --count       all login names and number of users logged on

  -r, --runlevel    print current runlevel

  -s, --short       print only name, line, and time (default)

  -t, --time        print last system clock change

  -T, -w, --mesg    add user's message status as +, - or ?

  -u, --users       list users logged in

      --message     same as -T

      --writable    same as -T

      --help     display this help and exit

      --version  output version information and exit


옵션 중에 -b 옵션이 마지막 시스템 부팅 시간을 출력한다는 것을 확인할 수 있습니다.


그럼 한 번 써보죠.

[keichee@server1 ~]$ who -b

         system boot  2017-06-22 17:13

17년 6월 22일 17시 13분에 시스템이 기동됐음을 알 수 있습니다.


이상입니다.


오늘은 여기까지~ 

리눅스 환경에 배포한 WAR 또는 JAR 파일에 새로운 파일을 추가하거나 기존 파일을 업데이트하는 방법


안녕하세요, 케이치입니다. 


오늘은 리눅스 환경에 배포한 WAR 또는 JAR 파일에 새로운 파일을 추가하거나 기존 파일을 업데이트하는 방법을 알려드리겠습니다. 그닥 이렇게 할 일이 없다보니 할 때마다 계속 까먹어서 그냥 혼자 끄적일겸 적어봅니다.


우선 /mydir/myapp.war 파일이 있다고 가정합니다.


우선 이 파일안에 어떤 파일이 있는지부터 확인해보죠.


$ cd /mydir

$ ll    (또는 ls -l)

-rw-rw-r--. 1 keichee keichee 63378 Nov  6 11:37 myapp.war


$ unzip -l myapp.war


Archive:  myapp.war

  Length      Date    Time    Name

---------  ----------   -----    ----

        0  11-06-2017 11:28   META-INF/

     128  11-06-2017 11:28   META-INF/MANIFEST.MF

        0  11-06-2017 11:28   css/

        0  11-06-2017 11:28   images/

        0  11-06-2017 11:28   WEB-INF/

        0  11-06-2017 11:28   WEB-INF/classes/

        0  11-06-2017 11:28   WEB-INF/classes/com/

        0  11-06-2017 11:28   WEB-INF/classes/com/my/

.
.....중략.....
.
  85308  08-14-2017 17:37   WEB-INF/lib/spring-oxm-4.3.0.RELEASE.jar
 587278  08-14-2017 17:37   WEB-INF/lib/spring-test-4.3.0.RELEASE.jar
 266993  08-14-2017 17:37   WEB-INF/lib/spring-tx-4.3.0.RELEASE.jar
 808847  08-14-2017 17:37   WEB-INF/lib/spring-web-4.3.0.RELEASE.jar
 905320  08-14-2017 17:37   WEB-INF/lib/spring-webmvc-4.3.0.RELEASE.jar
---------                           -------
 44109477                        393 files

WAR파일안에 어떤 파일들이 들어가있는지 디렉토리 경로까지 전부 확인할 수 있습니다.


이제 파일 하나를 추출해보도록 하죠.


추출할 대상은 /META-INF/MANIFEST.MF 입니다. 사이즈가 128이군요.


$ unzip myapp.war META-INF/MANIFEST.MF

Archive:  myapp.war

  inflating: META-INF/MANIFEST.MF

$ ll   (또는 ls -l )

-rw-rw-r--. 1 keichee keichee 44109477 Nov  6 11:37 myapp.war

drwxrwxr-x. 3 keichee keichee       17 Nov  9 14:42 META-INF

META-INF 디렉토리가 생성된 것을 확인할 수 있습니다.


$ cd META-INF

$ ls -l

-rw-rw-r--. 1 keichee keichee 128 Nov  6 11:28 MANIFEST.MF


파일이 있는 것을 확인할 수 있습니다. 사이즈가 128로 위에서 조회한 것과 동일하네요.


그럼 파일을 수정해볼까요?


$ vi MANIFEST.MF


마음대로 내용을 수정해서 파일 사이즈가 달라지도록 해주세요.


$ ls -l

-rw-rw-r--. 1 keichee keichee 145 Nov  9 13:38 MANIFEST.MF


파일의 사이즈와 시간이 변경되었네요. 128 -> 145


그럼 이 파일을 이제 다시 WAR 파일안으로 업데이트해서 넣어보도록 하겠습니다.


$ jar uvf myapp.war META-INF/MANIFEST.MF

adding: META-INF/MANIFEST.MF(in = 145) (out= 120)(deflated 17%)


파일을 추가한다고 나오면서 압축이 얼마나 됐는지가 나오네요. 17%가 압축됐습니다. 참고로 여기서 in은 실제 파일 사이즈out은 압축된 파일사이즈 입니다.


만약 jar 명령어가 없을 경우에는 zip 명령어를 사용할 수도 있습니다.

$ zip -r myapp.war META-INF/MANIFEST.MF

adding: META-INF/MANIFEST.MF(in = 145) (out= 120)(deflated 17%)



이제 다시 myapp.war 파일에 어떤 파일들이 있는지 조회해보도록 하겠습니다.


$ unzip -l myapp.war


Archive:  myapp.war

  Length      Date    Time    Name

---------  ----------   -----    ----

        0  11-06-2017 11:28   META-INF/

     145  11-09-2017 13:38   META-INF/MANIFEST.MF

        0  11-06-2017 11:28   css/

        0  11-06-2017 11:28   images/

        0  11-06-2017 11:28   WEB-INF/

        0  11-06-2017 11:28   WEB-INF/classes/

        0  11-06-2017 11:28   WEB-INF/classes/com/

        0  11-06-2017 11:28   WEB-INF/classes/com/my/

.
.....중략.....
.
  85308  08-14-2017 17:37   WEB-INF/lib/spring-oxm-4.3.0.RELEASE.jar
 587278  08-14-2017 17:37   WEB-INF/lib/spring-test-4.3.0.RELEASE.jar
 266993  08-14-2017 17:37   WEB-INF/lib/spring-tx-4.3.0.RELEASE.jar
 808847  08-14-2017 17:37   WEB-INF/lib/spring-web-4.3.0.RELEASE.jar
 905320  08-14-2017 17:37   WEB-INF/lib/spring-webmvc-4.3.0.RELEASE.jar
---------                           -------
 44109494                        393 files


파일 사이즈와 날짜가 변경이 되었네요.

참고로 여기에 조회되는 파일사이즈는 압축되기 전의 파일 사이즈입니다.


- 현든 file

find . -type f|wc -l




- 현재 디렉토리 하위의 모든 디렉토리에서 가 class
find . -name '*.class' | wc -l

CentOS 6를 처음 설치하면 Open JDK가 기본적으로 설정되어있다. 하지만 개발자들이 쓰기에는 그닥 적합하지 않은것 같다. 이런저런 문제도 좀 있는것 같고. 그래서 찾아보다가 alternatives에 대해서 보게되었다.


[root@mycom ~]# alternatives


대체 버전 1.3.49.3 - Copyright (C) 2001 Red Hat, Inc.
GNU Public License하에서 이 프로그램을
자유롭게 재배포 할 수 있습니다.
사용법: alternatives --install <링크> <이름> <경로> <우선순위>
                    [--initscript <서비스>]
                    [--slave <링크> <이름> <경로>]*
       alternatives --remove <이름> <경로>
       alternatives --auto <이름>
       alternatives --config <이름>
       alternatives --display <이름>
       alternatives --set <이름> <경로>

일반 옵션: --verbose --test --help --usage --version
                --altdir <디렉토리> --admindir <디렉토리>


여기서 저 alternatives라는 실행파일의 실제경로는 /usr/sbin/alternatives 이다.


요놈이 무슨 일을 하느냐하면 링크를 생성하는데 이 링크의 대상이 되는 녀석들을 옵션으로 여러개를 저장을 해놓았다가 필요할 때 마다 바꿔가며 쓸 수 있다는 것이다.


그럼 지금 내 컴퓨터에는 java명령어와 연결되어있는 실행파일들이 몇개나 되는지 한번 볼까?


[root@mycom ~]$ /usr/sbin/alternatives --config java

1 개의 프로그램이 'java'를 제공합니다.

  선택    명령
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:


자, 이런식으로 선택할 수 있는 옵션이 나온다.


이제 선택옵션을 하나 더 추가해보자.


[root@Emerald ~]# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_45/bin/java 2

[root@Emerald ~]# alternatives --config java

2 개의 프로그램이 'java'를 제공합니다.

  선택    명령
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   2           /usr/java/jdk1.6.0_45/bin/java

현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:2


alternatives --install 명령을 이용하여 /usr/bin/java 링크에 /usr/java/jdk1.6.0_45/bin/java를 java라는 이름으로 연결을 시켰고 우선순위를 2로 주었다. 그리고 alternatives --config 명령을 이용해서 선택을 2번으로 변경했다.


이렇게 옵션으로 명령어의 링크를 관리할 수 있기 때문에 나름 유용한 팁이 아닐까 싶다.


더 자세한 내용은 구글링이나 man페이지를 읽어보시면 됩니다~~~









💻 Programming/WAS

JBoss 7 리눅스에 설치하기


1. 준비사항
리눅스 서버 환경에 JAVA 를 설치합니다.

2. JBOSS 다운로드 및 설정

3. JBOSS start/stop/restart 스크립트 만들기

 

4. JBOSS 바인딩 변경

5. 웹접속 확인
웹브라우저 주소창에 http://IP어드레스:8080 입력하여 접속합니다.

jboss

6. JBOSS Admin 콘솔접속

 

웹브라우저 창에 http://ip어드레스:9990 하여 관리콘솔로 접속 합니다.

jboss2

jboss3

참조 : http://www.davidghedini.com/pg/entry/install_jboss_7_on_centos

리눅스 서버에 웹서버를 설치한다던가 할 때에 플랫폼에 맞춰서 설치를 해야하는데 이때 플랫폼이 뭔지 까먹거나 내가 만지는 서버가 아니면 모를 수 밖에 없죠. 그럴 때는 아래와 같은 명령어를 사용하시면 됩니다.


# uname -a


이렇게 했을 때 두가지 형태로 결과가 나옵니다.


1) x86  ( 32bit )

2) x86_64 ( 64bit )


간단하죠?