반응형

tomcat 8 설치. 서비스 등록 스크립트

  • OS 는 데비안
  • openjdk 8 은 검색하면 쉽게 구할 수 있다.
  • openjdk 8 로 tomcat 구동
  • tomcat8 계정을 생성한다. (tomcat8 계정 권한으로 프로세스 구동)

- JDK 설치

cp openlogic-openjdk-8u342-b07-linux-x64.tar.gz /usr/lib/jvm/
cd /usr/lib/jvm
tar xvfz openlogic-openjdk-8u342-b07-linux-x64.tar.gz
mv openlogic-openjdk-8u342-b07-linux-x64 openjdk-8
rm openlogic-openjdk-8u342-b07-linux-x64.tar.gz

JAVA_HOME은 아래와 같다. 
/usr/lib/jvm/openjdk-8

- tomcat 설치

; tomcat 계정 생성
루트 계정으로 아래 작업!
useradd -d /home/tomcat8 -M tomcat8  ; 계정 생성. (홈디렉터리 생성하려면 -M 대신 -m)
(참고) userdel -r tomcat8  ; tomcat8 계정 및 폴더 삭제.

; apache-tomcat-8.5.84.tar.gz 을 설치할 위치로 복사. 
mv apache-tomcat-8.5.84.tar.gz /home
cd /home
tar xvfz apache-tomcat-8.5.84.tar.gz
mv apache-tomcat-8.5.84 tomcat8
; 이름을 간단하게 tomcat8로 변경. 위 tomcat8 계정의 home 디렉터리가 됨.

- 권한 설정
chown -R tomcat8:tomcat8 /home/tomcat8

- 기본적인 설정 작업
$ cd /home/tomcat8/conf
$ vi server.xml

; 예를 들어서 포트 변경을 다음과 같이 할 수 있다.  WAS 포트는 58080, 58443 으로 한다.
<Connector port="58080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="58443" />

AJP 포트는 58009 로 설정한다.
<Connector protocol="AJP/1.3"
               address="0.0.0.0"
               secretRequired="false"
               port="58009"
               redirectPort="58443" />
  • 서비스 구동 스크립트
    (아래 내용을 그대로 붙여 넣으면 파일이 생성됨.)
    (직접 편집하려면 [Unit] 부터 EOF 이전까지 복사해서 붙여넣기 사용)
    경로명을 잘 확인한다.

cat << EOF > /etc/systemd/system/tomcat8.service
[Unit]
Description=Apache Tomcat Service
After=syslog.target network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/openjdk-8"
Environment="CATALINA_HOME=/home/tomcat8"
Environment="CATALINA_BASE=/home/tomcat8"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

ExecStart=/home/tomcat8/bin/startup.sh
ExecStop=/home/tomcat8/bin/shutdown.sh

User=tomcat8
Group=tomcat8

[Install]
WantedBy=multi-user.target
EOF

  • 서비스 자동 시작 등록 및 구동 테스트

systemctl enable tomcat8
systemctl start tomcat8
systemctl stop tomcat8
반응형

Openssl SSL 인증서 만들기 / 웹서버(apache2) SSL 설정

- pem, key 파일 생성

; 서버 개인키 발급
openssl genrsa -des3 -out server.key 2048

; 인증요청서 생성 (csr)
openssl req -new -key server.key -out server.csr
!!!! CN 입력(Common Name)시에 맵핑할 도메인을 적는다. www.abc.com !!!
; kr seoul seoul mycompany myteam www.abc.com 나머지는계속엔터.

; 개인키에서 패스워드 제거 (키에 패스워드가 있으면 아파치 구동시마다 물어보니
; 패스워드 지우면 편리, 기존 암호화 파일은 org로 백업.)
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

; 인증서 생성
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
; 이제 key와 crt 파일로 SSL 설정시 사용하면 된다. 또는 pem으로 변경하여 사용. 
; 형식변환
openssl x509 -outform pem -in server.crt -out servercert.pem

아래 두 파일을 사용하면 된다.
server.key
servercert.pem

 

- Apache2 웹서버에 SSL 설정


* 인증서 등록
$vi /etc/apache2/sites-available/default-ssl.conf
; 기존 SSLCertificateFile, SSLCertificateKeyFile 두 줄을 아래와 같이 수정한다. 
; (인증서 파일 경로 확인)

SSLCertificateFile /etc/apache2/servercert.pem
SSLCertificateKeyFile /etc/apache2/server.key
# AJP tomcat 연동을 할 경우에는 JkMount 설정으로 worker 연결한다. 
# JkMount /* myworker

* SSL 활성화
; 아래 커맨드들을 실행한다.

a2enmod ssl
cd /etc/apache2/sites-available
a2ensite default-ssl.conf

; apache2 재시작
systemctl restart apache2
반응형

docker debian apache2 tomcat 연동

도커 환경으로 apache 웹 서버와 뒤에 tomcat WAS를 1개 띄우는 형식. 두 개의 분리된 서버(Web, WAS)
웹 서버는 80포트로 받아서 WAS1에 8010 포트로 연결한다.

데비안으로 할 거라서 먼저 준비 과정이 필요함. 이미지를 만들기 위해 모든 설치과정 커맨드들을 준비해야 한다. 설정 파일들에서 어디를 고칠지 확인.

여기서는 foreground 로 실행할 예정.

test. 준비 과정.

docker run -it -p 80:80 -p 18080:8080 -p 443:443 -p 18443:8443 debian

docker run -it -p 80:80 -p 443:443 -p 18443:8443 myweb

$

apt update
apt install -y curl wget net-tools systemd vim
curl -sSL https://packages.sury.org/apache2/README.txt | bash -x
apt install apache2 libapache2-mod-jk openjdk-11-jre -y

mkdir -p /usr/local
cd /usr/local
wget --no-check-certificate https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz
tar xvfz apache-tomcat-8.5.51.tar.gz
mv apache-tomcat-8.5.51 tomcat8
rm apache-tomcat-8.5.51.tar.gz

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

# 도커라 systemctl 커맨드가 안됨. service 커맨드는 작동하네.
service apache2 start
service apache2 status

# 이렇게 실행하면 종료되지 않는다. 
환경변수 세팅 필요.
source /etc/apache2/envars

apachectl -D FOREGROUND
또는
/usr/sbin/apache2 -D FOREGROUND

바로 foreground로 돌리면 경로 없어서 실패가 발생함. 
mkdir -p /var/run/apache2

tomcat docker
http://IP:18080/

apache2
http://IP/

-- 설정 변경 스크립트를 만들기 위해... 
cat -n 000-default.conf ; 줄번호가 출력됨. 오호.. 이런 기능이!

설정파일에서 스트링 변경
worker 설정 경로를 따로 만들어 주었다. 
sed -i 's/libapache2-mod-jk\/workers.properties/apache2\/workers.properties/g' /etc/apache2/mods-available/jk.conf

13번 라인에 insert 하고 싶은데. 아래 baclash 사이에 내용을 쓴다. 
sed -i '줄번호i\내용\' 파일명  ; 줄번호라인 위에 한줄이 삽입됨. 
즉, 추가한 줄이 입력한 줄번호가 된다.

sed -i '13i\ JkMount /* myworker\' 000-default.conf



-- workers.properties
# cat workers.properties
#
workers.tomcat_home = /usr/local/tomcat8
workers.java_home = /usr/lib/jvm/java-11-openjdk-amd64

worker.list = myworker
worker.myworker.port = 8009
worker.myworker.host = mywas1c
worker.myworker.type = ajp13

 


web1 apache2 : myweb1 (HTTP)

root@mobiledeep:/home/psychic/docker/docker_gpms/web# cat Dockerfile
FROM debian

RUN apt update
RUN apt install -y curl wget net-tools systemd vim
RUN curl -sSL https://packages.sury.org/apache2/README.txt | bash -x
RUN apt install apache2 libapache2-mod-jk openjdk-11-jre -y

COPY workers.properties /etc/apache2/workers.properties
RUN sed -i 's/libapache2-mod-jk\/workers.properties/apache2\/workers.properties/g' /etc/apache2/mods-available/jk.conf
RUN sed -i '13i\ JkMount /* myworker\' /etc/apache2/sites-available/000-default.conf

#RUN mkdir -p /usr/local && cd /usr/local && wget --no-check-certificate https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz && tar xvfz apache-tomcat-8.5.51.tar.gz && mv apache-tomcat-8.5.51 tomcat8
#RUN rm /usr/local/apache-tomcat-8.5.51.tar.gz

RUN mkdir -p /var/run/apache2
ENV APACHE_RUN_USER=www-data
ENV APACHE_RUN_GROUP=www-data
ENV APACHE_PID_FILE=/var/run/apache2/apache2.pid
ENV APACHE_RUN_DIR=/var/run/apache2
ENV APACHE_LOCK_DIR=/var/lock/apache2
ENV APACHE_LOG_DIR=/var/log/apache2
ENV export LANG=C

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
#CMD ["/bin/bash"]

EXPOSE 80
EXPOSE 443

구동 스크립트

root@mobiledeep:/home/psychic/docker/docker_gpms/web# cat startup.sh
# docker build -t myweb1 .
docker rm -f myweb1c
docker run --rm --name myweb1c -it -p 80:80 -p 443:443 --link mywas1c:mywas1c myweb1
  • link 옵션 때문에 tomcat이 먼저 떠 있어서 작동한다.

tomcat 8.5 ; mywas1

root@mobiledeep:/home/psychic/docker/docker_gpms/was# cat Dockerfile
FROM debian

RUN apt update
RUN apt install -y curl wget net-tools systemd vim
RUN apt install openjdk-11-jre -y

RUN mkdir -p /usr/local && cd /usr/local && wget --no-check-certificate https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz && tar xvfz apache-tomcat-8.5.51.tar.gz && mv apache-tomcat-8.5.51 tomcat8 && perl -p -i -e '$.==114 and print " <Connector protocol=\"AJP/1.3\" secretRequired=\"false\" address=\"0.0.0.0\" port=\"8009\" redirectPort=\"8443\" />\n"' /usr/local/tomcat8/conf/server.xml
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh", "run"]

#COPY server.xml /etc/apache2/qauth.conf
#CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
#CMD ["/bin/bash"]

EXPOSE 8080
EXPOSE 8009
EXPOSE 8443

----
빌드
# docker build -t mywas1 .
  • 구동 스크립트. foreground.
root@mobiledeep:/home/psychic/docker/docker_gpms/was# cat startup.sh
# docker build -t mywas1 .
docker rm -f mywas1c
docker run --rm --name mywas1c  -it -p 8080:8080 -p 8443:8443 -p 8009:8009 mywas1

web2 : SSL 설정 (myweb2)

  • SSL 설정은 web 만 하면 된다.
  • SSL 인증서는 테스트용으로 self-sign 인증서를 만들면 된다. (openssl 커맨드로 쉽게 만들 수 있음.)
  • 필요한 커맨드 조사
기존에서 더 작업해야 할 것들.

sed -i '32,33d' /etc/apache2/sites-available/default-ssl.conf
sed -i '32i\SSLCertificateFile /etc/apache2/servercert.pem\' /etc/apache2/sites-available/default-ssl.conf
sed -i '33i\SSLCertificateKeyFile /etc/apache2/server.key\' /etc/apache2/sites-available/default-ssl.conf
sed -i '34i\JkMount /* myworker\' /etc/apache2/sites-available/default-ssl.conf

a2enmod ssl
cd /etc/apache2/sites-available
a2ensite default-ssl.conf

root@mobiledeep:/home/psychic/storage/docker/docker_gpms/web# cat Dockerfile
FROM debian

RUN apt update
RUN apt install -y curl wget net-tools systemd vim
RUN curl -sSL https://packages.sury.org/apache2/README.txt | bash -x
RUN apt install apache2 libapache2-mod-jk openjdk-11-jre -y

COPY workers.properties /etc/apache2/workers.properties

RUN sed -i 's/libapache2-mod-jk\/workers.properties/apache2\/workers.properties/g' /etc/apache2/mods-available/jk.conf
RUN sed -i '13i\ JkMount /* myworker\' /etc/apache2/sites-available/000-default.conf

# SSL
COPY server.key /etc/apache2/server.key
COPY servercert.pem /etc/apache2/servercert.pem
RUN sed -i '32,33d' /etc/apache2/sites-available/default-ssl.conf
RUN sed -i '32i\SSLCertificateFile /etc/apache2/servercert.pem\' /etc/apache2/sites-available/default-ssl.conf
RUN sed -i '33i\SSLCertificateKeyFile /etc/apache2/server.key\' /etc/apache2/sites-available/default-ssl.conf
RUN sed -i '34i\JkMount /* myworker\' /etc/apache2/sites-available/default-ssl.conf

#RUN mkdir -p /usr/local && cd /usr/local && wget --no-check-certificate https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz && tar xvfz apache-tomcat-8.5.51.tar.gz && mv apache-tomcat-8.5.51 tomcat8
#RUN rm /usr/local/apache-tomcat-8.5.51.tar.gz

RUN mkdir -p /var/run/apache2
ENV APACHE_RUN_USER=www-data
ENV APACHE_RUN_GROUP=www-data
ENV APACHE_PID_FILE=/var/run/apache2/apache2.pid
ENV APACHE_RUN_DIR=/var/run/apache2
ENV APACHE_LOCK_DIR=/var/lock/apache2
ENV APACHE_LOG_DIR=/var/log/apache2
ENV export LANG=C

# SSL
RUN a2enmod ssl && cd /etc/apache2/sites-available && a2ensite default-ssl.conf

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
#CMD ["/bin/bash"]

EXPOSE 80
EXPOSE 443

구동스크립트

root@mobiledeep:/home/psychic/storage/docker/docker_gpms/web# cat startup.sh
docker build -t myweb1 .
docker rm -f myweb1c
docker run --rm --name myweb1c -it -p 80:80 -p 443:443 --link mywas1c:mywas1c myweb1
반응형

Docker tomcat mysql mongo

tomcat 서버에서 mysql과 mongodb를 동시에 사용할 일이 있어서 도커 환경으로 만들어봤다.

clean.sh

#!/bin/sh
/usr/bin/sudo rm -rf ./db ./webapps ./mongo
mkdir db
mkdir mongo
mkdir -p webapps
mkdir initdb
cd initdb
initdb.sql : 테이블 스키마. 초기 데이터 쿼리
mkdir initmongo
cd initmongo
cat > initdb.js
db.createUser(
    {
        user: "myhome",
        pwd: "myhome00.",
        roles:[
            {
                role: "readWrite",
                db:   "DB_ANALYZE"
            }
        ]
    }
);
mkdir locallib
cd locallib
*.so 파일 복사. (/usr/local/lib 으로 연결)
mkdir myhome
cd myhome
was에서 사용하는 설정 파일들

docker-compose.yml

version: '2'
services:
        db:
                image: mysql:5.7
                environment:
                        MYSQL_ROOT_PASSWORD: myhome00.
                        MYSQL_DATABASE: DB_ANALYZE
                        MYSQL_USER: myhome
                        MYSQL_PASSWORD: myhome00.
                ports:
                        - "3306:3306"
                volumes:
                        - ./mycustom.cnf:/etc/mysql/conf.d/custom.cnf
                        - ./db:/var/lib/mysql
                        - ./initdb:/docker-entrypoint-initdb.d
                restart: always
        mongo:
                image: mongo
                environment:
                        MONGO_INITDB_ROOT_USERNAME: myhome
                        MONGO_INITDB_ROOT_PASSWORD: myhome00.
                        MONGO_INITDB_DATABASE: DB_ANALYZE
                ports:
                        - "27018:27017"
                volumes:
                        - ./mongo:/data/db
                        - ./initmongo:/docker-entrypoint-initdb.d
                restart: always

        web:
                image: crazyj7/ubuntu16.04-tomcat8-jre8
                depends_on:
                        - db
                        - mongo
                environment:
                        JDBC_URL: jdbc:mysql://db:3306/DB_ANALYZE?connectTimeout=0&amp;socketTimeout=0&amp;autoReconnect=true
                        JDBC_USER: myhome
                        JDBC_PASS: myhome00.
                ports:
                        - "9090:8080"
                mac_address: 02:42:ac:15:00:03
                volumes:
                        - ./webapps:/usr/local/tomcat/webapps
                        - ./myhome:/myhome
                        - ./locallib:/usr/local/lib
                links:
                        - db
                        - mongo
                restart: always

mycustom.cnf

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake
skip-name-resolve

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

! 중요!! skip-name-resolve를 위에 지정하지 않으면 DB 접속시 1분정도??? Delay가 발생하는 현상이 생길수 있다!

실행

docker-compose up

다른 쉘에서 war를 webapps에 복사한다.

9090 포트로 접속하여 테스트

반응형

도커 환경에서 tomcat, mariadb 컨테이너 구성하여 테스트하는 중.

이상한 증상이 있었음.

war를 올려서 구동하는데, 너무 늦게 구동됨. 1분 정도?? 딜레이가 발생하였다...

tomcat 로그를 봐도 알수가 없었음. WAR가 풀리고 중간에 1분 정도 멈췄다가 다시 진행되어 WAS가 구동되는 현상.

원인은??? DB의 name resolve 문제였음. DBMS가 외부에서 온 접속을 IP 주소에서 호스트명으로 변환을 시도하다 호스트명 resolve를 못하고 타임아웃까지 기다리는 현상이 원인이었던 것으로 추정된다. (어디서는 이런 현상이 없었는데, 어디서는 이런 현상이 발생하고 그랬다. 어떤 환경차이인지는 모르겠다.)

해결방안 my.cnf 파일을 만들어 DB 컨테이너 만들때 config에 넣어준다. 아래에서 보면 skip-name-resolve  한 줄을 추가했더니, 위에 1분간 딜레이되던 현상이 없어졌다. 바로 war가 풀리고 정상 가동되었다. 

my.cnf

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake
skip-name-resolve
#default-authentication-plugin=mysql_native_password
#sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

(sql_mode가 DBMS에 따라 가끔 지원하지 않는 필드들이 있어서 위에 주석처리한 것들이 있음.)

 

+ tomcat, mariadb 도커 환경 구축

여기서는 식별을 위해서 컨테이너 이름이나 포트번호에 2를(db2, 23306, tomcat2, 28080 등) 붙였다. (이후에 또 만들것들은 3, 4, 등으로 연속해서 추가하는 방식으로 관리하였다.)

1. create_db.sh ; DB 컨테이너 생성하여 실행 또는 있으면 재실행

현재 폴더에 db 폴더가 없으면 최초 실행으로 판단하여 db 설정(my.cnf)를 복사하고 DB를 초기화한다.

#!bin/sh
if [ "$(ls -A db)" ]; then
	echo "db dir is already exist."
else
	echo "created db dir and copied my.cnf."
	mkdir -p db/config
	cp my.cnf db/config
fi

docker rm -f db2
docker run -d --restart always \
--name db2 \
-v /home/storage/2.mysvc/db/config/my.cnf:/etc/mysql/my.cnf \
-v /home/storage/2.mysvc/db/data:/var/lib/mysql \
-v /home/storage/2.mysvc/db/log:/var/log/mysql \
-v /home/storage/2.mysvc/db/temp:/temp \
--privileged \
-p 23306:3306 \
-e TZ=Asia/Seoul \
-e LC_ALL=C.UTF-8 \
-e MYSQL_ROOT_PASSWORD=mysvc00. \
mariadb:latest

위 쉘을 실행하여 mariadb가 떴으면 23306 포트로 접속하여 쿼리로 데이터베이스와 테이블들을 생성해 주면 된다.

 

2. create_tomcat.sh ; tomcat 실행 또는 재실행(이미 컨테이너가 떠 있는 경우)

아래의 경우 맥주소를 고정할 필요가 있어서 --mad-address 옵션을 추가한 것이다. (필요시 사용)

webapps 폴더가 생성될 것이고, 여기에 war를 올리면 구동될 것이다.

myconfig라고 폴더를 지정한 것은 war에서 사용할 설정 파일들을 특정 위치에 고정시키려고 한 것이다. (필요시 사용)

locallib 폴더는 native library (*.so)를 JVM에서 사용하려고 올려 넣은 것이다. (필요시 사용)

link로 위에서 만든 컨테이너 db2를 사용할수 있도록 지정함.

#!/bin/sh
docker rm -f tomcat2
docker run -d --restart always \
--mac-address=12:33:44:55:66 \
--name tomcat2 \
-v /home/storage2/2.mysvc/myconfig:/myconfig \
-v /home/storage2/2.mysvc/webapps:/usr/local/tomcat/webapps \
-v /home/storage2/2.mysvc/locallib:/usr/local/lib \
--privileged \
--link db2:db2 \
-p 28080:8080 \
-e TZ=Asia/Seoul \
-e LC_ALL=C.UTF-8 \
-e JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+9:00 -Djava.library.path=/usr/local/lib" \
tomcat:8

war 설정 파일들(/myconfig)과 war 파일을 다 올렸으면, 로그를 확인함.

3. log.sh  ; 톰캣 최근 1분 로그부터 보기

#!/bin/sh
docker logs -f --since 1m tomcat2

4. stop.sh ; 컨테이너 종료.

#!/bin/sh
docker rm -f db2
docker rm -f tomcat2

 

이제 간단하게 shell script 만 실행하면서 쉽게 개발 테스트를 할 수 있다.

 

반응형
bash_Tip_작업속도

Bash Tip 작업속도를 빠르게

다음 방법을 알게 되면 bash 쉘 상에서 커맨드 입력 속도가 아주 빨라진다.

이전 명령어 실행

보통은 쉘상에서 위아래로 이동하여 전에 실행한 명령어를 찾아 실행하면 된다.
하지만 아래와 같이 하는 것이 더 편리할 때가 있다.

!! ; 바로 전 명령어
!스트링 ; 해당 스트링으로 시작하는 최근 커맨드.
!번호 ; history 번호

$ gcc a.c 
$ ls -al C*
...
$ ping 8.8.8.8

$ !!
 이전 명령어 ping 8.8.8.8 가 실행된다.
$ !l
  이전 명령어 중 l로 시작하는 최근 명령어를 실행한다.
  즉, 위에 ls -al C*
$ !gc
  이전 명령어 중 gc로 시작하는 것을 실행.
  즉, gcc a.c

또는 명령어 히스토리를 보고 번호로 실행할 수 있다.

$ history
50 netstat -ant
51 ls -al
52 gcc a.c

$ !50
	히스토리에서 50번 명령어를 실행한다.
	즉, netstat -ant 를 실행.

터미널 종료

^+C ; 현재 실행 중인 프로그램 종료. interrupt
^+D ; 터미널 종료. (logoff)

화면 지우기

clear 를 실행하면 터미널 화면을 지운다.
더 간편한 방법으로 단축키가 있다.
^+L ; clear 커맨드와 같다.

TAB 자동 완성

파일명을 모두 입력할 필요가 없다. 간단히 TAB키를 활용.
탭. 또는 탭탭.

$ ls a ; 여기서 TAB키를 누르면 a로 시작하는 파일이 자동으로 나타난다.
$ ls abc

위 경우 나타나지 않으면 없거나 여러 개라서 그렇다.

$ ls a ; 여러 개인 경우 TAB키를 한 번 더 누르면 모두 출력된다.
a1
a2
a3
...

커서위치 뒤로 삭제

이전 커맨드를 커서로 찾다가 뒷 부분을 다 수정해야 하는 경우.
^+K ; 커서위치 포함하여 뒤로 나온 텍스트 삭제 (cut)
^+U ; 커서 전에 나온 앞의 텍스트를 삭제 (cut)
^+Y ; 삭제된 텍스트를 붙여넣기
^+W ; 현재 입력한 커맨드 삭제.

$ ping 1.2.3.4
위 커맨드에서 커서를 3 위치로 이동하고 ^+K  (3.4가 삭제)
$ ping 1.2.   이후에 수정하면 된다.

$ ping 9.9. 여기서 ^+Y를 누르면 삭제됐던 텍스트가 붙여넣기가 됨
$ ping 9.9.3.4

커서 위치 이동

^+A ; 맨 앞으로 이동
^+E ; 맨 뒤로 이동

명령어 편집

먼저 환경변수에 기본 EDITOR를 vi로 설정해 둔다.
.bashrc 에 추가.

export EDITOR=vi

^+X+E ; 현재 입력한 커맨드를 편집기로 편집. (vi) 저장하고 빠져나오면 바로 편집한 명령어를 실행한다.

로그 보기 커맨드

대부분 로그 파일을 실시간으로 볼 때 tail을 많이 쓸 것이다.

tail -f catalina.out

이거 대신 아래 커맨드를 써라. (기본으로 Shift+F 효과가 들어감. 쓰다 보면 훨씬 편리하다.)

less +F catalina.out

less에는 유용한 다른 기능들이 많이 있다.

Shift+F ; 마지막으로 실시간 이동. (tail -f 처럼 실시간으로 추가되는 로그를 볼 수 있다.) less에 +F 옵션을 주면 바로 이 모드로 작동한다.
이 모드에서 ^+C를 tail -f 모드에서 빠져나온다.

위 모드에서 빠져나오면 기본으로 vi 편집기처럼 이동이 가능함. (^+B, ^+F 페이지 이동, j, k 위 아래 스크롤). 이전 데이터를 쉽게 볼 수 있고, 언제는 tail 모드로 진입했다 빠져나왔다 할 수 있다.

종료는 q

Author: crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat mysql mongodb  (0) 2021.10.31
[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Git 사용법_요약  (0) 2019.12.16
Ubuntu18/tomcat8 setup  (0) 2019.11.08
반응형
screen_백그라운드

리눅스 백그라운드 실행 (터미널종료에도)

터미널종료해도 백그라운드 실행유지. 요약.

  • 방법1 (nohup)
$ nohup [커맨드] &
  • 방법2 (disown)
$ 커맨드 &
$ disown 
  • 방법3 (screen)
$ screen -S [작업명] ; 작업명은 임의의 스트링...
$ [커맨드]
^A, d ; (컨트롤+A 누르고 d키를 누름) detach되면서 백그라운드로 돌아감. 
  • 로그아웃했다가 다시 로그인하여 프로세스 확인
ps -ef | grep [검색어] ; 프로세스가 잘 떠 있는지 확인

screen 백그라운드 실행

스크린 - 윈도우 개념.
스크린들을 여러 개 만들수 있고, 스크린 내부에 윈도우를 여러 개 만들 수 있다. (처음 스크린을 만들면 0번 윈도우가 자동으로 만들어짐)

스크린 만들기

screen -S [세션명]
ex)
screen -S edit
screen -S build

스크린 목록

screen -ls
여기에 Attached라고 되어 있는 것이 현재 screen.
전부 detached라고 나오면 스크린 상태가 아님.

스크린 나오기

^+A, d ; detach. 작업중인 것은 백그라운드로 계속 돌아간다.

스크린 재접속

screen -r [세션명]

스크린 내에서 윈도우 만들기

  • ^+A 누른 후에 C (create) 를 누름.

윈도우 종료는 exit

윈도우 목록. 몇 번 까지 있는지 하단에 나옴.
^+A, W ; window

윈도우 이동

^+A, a ; 바로 전
^+A, 0 ; 0번창
^+A, 1 ; 1번창.

screen 상태에서 화면 스크롤

스크린 상태에서는 쉬프트+PageUp (스크롤)이 먹히지 않는다. 화면이 깜빡이고 만다.
^+A, ESC ; vi모드로 이동 및 페이지 업 , 다운에 vi커맨드로 하면 된다. ^B, ^F
ESC를 누르면 스크롤 모드 해제.

nohup

nohup [커맨드] &
터미널 종료 후에도 계속 작업이 유지됨

&, bg, fg

백그라운드 실행을 하면, 쉘은 그대로 쓸 수 있는데, 백그라운드에서 터미널로 출력되는 메시지도 화면에 출력된다.

  • 백그라운드 실행
    ./a.sh &
    그러나 터미널 종료시 종료됨… (종료 방지를 하려면 screen이나 nohup을 사용)

  • 현재 실행중인 프로그램을 백그라운드로.

^+Z ; 일시 중단하고 shell로 빠져나옴.
jobs ; 백그라운드 조회. 번호와 커맨드가 나옴.
bg %1  ; %잡번호를 입력하여 백그라운드로 재개시킴.

기타

fg %1 ; 포그라운드로 재개됨.
kill %1 ; 잡1번 강제종료.

disown

그러나, 위 백그라운드는 터미널이 종료되면 프로세스도 종료된다.
이것을 방지하려면,

disown

disown을 하게 되면 현재 세션 job list에서 job 들이 빠져나가게 된다. (jobs 커맨드로 확인 가능. 프로세스 전체 보기로 보면 프로세스는 남아있음.)
따라서 터미널이 종료되어도 SIGHUP이 전달되지 않아서 계속 돌아가게 된다.

Author: crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
Git 사용법_요약  (0) 2019.12.16
Ubuntu18/tomcat8 setup  (0) 2019.11.08
VI 사용법  (0) 2015.06.02
반응형
git

Git simple guide


crazyj7@gmail.com

Start git repository download

git clone http://github.com/crazyj7/...git
git clone ssh://git@192.168…:2222/home/git/repos/…git

Work

make new branch and work

최신 master 브랜치를 받아서 작업 브랜치를 만들고 작업한다.

git pull
git branch alpha
[work to do…]

commit and push

변경된 파일들을 index표시를 하고 커밋한다. 그 후 원격 서버에 올린다.

git status .
git add -u
git add [files/dirs]
git commit -m “update message”
git push (or git push origin master)

merge to master

마스터 브랜치를 기준으로 새 작업 브랜치를 가져와 병합 한다.
병합후 변경내역을 원격 서버에 올린다.

git branch : 현재 브랜치 확인
git checkout master
현재 브랜치가 master로 변경됨
git merge alpha
현재 브랜치 기준으로 alpha 브랜치를 가져와 병합한다.
git push

rollback

작업한 파일을 원래대로 되돌리기(Warn!)

git checkout [file] or [. (current dir)]

마지막 커밋은 취소하고 수정했던 것도 전부 취소하기(Warn!)

cancel last commit
git reset --hard HEAD^ (HEAD~1 in Windows)
위 옵션에서 --hard 옵션을 빼면 커밋만 취소하고 수정 파일은 그대로 유지한다. (주의!!! 수정내역이 없어지므로 필요시 백업!)
git reset HEAD^

Cancel Merge (병합 취소)
merge후 conflict나고 처리가 복잡할 경우 바로 이전으로 돌아가기

git merge --abort


History

GUI로 히스토리를 확인할 수 있다.

gitk

한글이 깨질 경우 hangul encoding 변경 후, 다시 시작

git config --global gui.encoding utf-8


Errors

pull fail?

cancel all worked here. cancel commit.
변경 내역을 되돌리고, 다시 pull로 원격에서 업데이트한다.(Warn! 주의!!! 작업내용삭제됨!!! 일단 백업해 두는 것을 추천.)

git reset --hard HEAD^ (HEAD~1 in Windows) or HEAD
git pull

그래도 pull이 실패한다면 stash로 작업내역을 백업하고 다시 받는다.

git stash
git pull

참고

git reset --soft HEAD~ 는 HEAD를 한 커밋 이전으로 이동시킨다.
git reset HEAD~ 는 HEAD 이동 및 index도 이동한다.
git reset --hard HEAD~ 는 HEAD 이동, index 이동, working dir도 이전으로 돌린다.
git stash 는 reset을 하지만 변경내역은 백업을 해 둔다. 파일명 지정시 git stash save [file] , git stash list , git stash pop/apply 로 불러오기. 다른 브랜치에 잘못 작업한 것을 원래 브랜치로 이동시킬 때 사용가능

cancel git add?

git reset [file/dir]

conflict?

edit conflicted file and git add/ git commit
or choose one side

작업하고 commit을 하고 원격으로 push하는데 conflict가 발생할 수 있다. 이것은 원격에 이미 checkout받은 브랜치가 변경되었다는 것이다.

git push : 리모트에서 거부 발생!!!
git pull
conflict!!! 자동병합 충돌 발생!!! 충돌 파일 확인!!
git status : 충돌파일 정보
파일이 병합처리되어 >>>(원격) <<<(로컬) 등 문자 포함
이 때는 파일을 수정하고 다시 커밋하고 푸시하는 방식이 있고, 어느 한 쪽을 선택할 수도 있다.

충돌 발생시 충돌 파일을 수정하든지 어느 한 쪽을 골라야 한다.
현재 브랜치 기준으로 내것과 원격의 것을 잘 구분해야 한다.

git checkout --ours [file] : 로컬파일이 진짜다. 로컬 우선!!!
git checkout --theirs [file] : 서버에 있는 최신것을 따르겠다. (주의!!! 로컬 파일 내용은 없어짐!!! 로컬을 무시하겠다.)

or edit file (양쪽을 모두 반영하겠다. >>> <<< 파일 수정 )
git add -u
git commit -m “update”
git push

cancel delete local file

파일을 잘못 삭제했을 경우 복구하는 법

git status . ; check which file is deleted.
git checkout HEAD [file]

cancel work

git reset . ; reset all worked
git checkout . ; go before work


Ignore files

If you dont want to upload some files or dirs,
create .gitignore file in the current directory.
add files or dirs
ex)

build/
*.obj
dataset/
*.o


Branch merge

  • fast-forward
    only one branch is changed or it doesn’t exist same file changed.)
    a -> b(master) : no change
    b(newbranch) -> x ->y(bugfix)
    merge : a->b->x->y (master=bugfix)
    git push or git pull
    특별히 겹치는 부분이 없으면 자동으로 충돌없이 병합된다.
  • merge commit
    Both branches are changed. Update conflict files and commit
    git checkout master : 마스터를 가져와서 (항상 메인을 기준으로)
    git merge alpha : 알파를 불러와 현재(마스터)와 합친다.
    충돌이 나면 해당 파일을 수정하고 병합한다. 여러 브랜치가 하나의 브랜치(현재 브랜치)로 합쳐진다. 과거 히스토리 유지.
  • rebase
    a -> b -> c -> d (master)
    b -> x -> y (alpha(bugfix))
    위 버그 수정 브랜치를 마스터로 반영하고, 마스터만 유지하고 싶다. 그런데 버그패치동안에 마스터가 변경된 상태다.
    merge: a->b->c->d ->x->y (master=bugfix)
    git checkout alpha : 수정 브랜치를 가져와서
    git rebase master : 마스터에 연결시도
    update conflict files : 충돌발생 파일 수정(c,d,x,y)
    git add -u
    git rebase --continue : 리베이스 계속 진행
    git checkout master : 마스터를 가져와서
    git merge alpha : 알파를 현재로 불러와서 병합.
    베이스를 새로 지정한다. 위의 브랜치 트리가 한 줄로 만들어진다. 과거 히스토리 변경 주의.

Delete branch

브랜치 삭제 -d 옵션으로 안되면 -D 옵션으로 한다.

git branch -d [alpha]


Delete file

로컬 및 저장소에서 파일 삭제

  • Remove the file in both local and remote github
    git rm [file]

저장소에서만 삭제하고 로컬 파일은 보존

  • Remove remote file in github but remain it in local
    git rm --cache [file]

Delete all .git files

리눅스에서 모든 .git 폴더 제거하기(incude subdir)

check files…
find . -name ‘.git’
WATCHOUT!!!
find . -name ‘.git’ -prune -exec rm -rf {} +

윈도우에서 모든 .git 폴더 제거하기(incude subdir)

batch file create
FOR /r “c:\temp” %%f IN (.git) DO RD /s /q “%%f”

삭제하기 전에 목록 출력만(rd /s /q 대신 echo) 해서 확인을 하는 것이 좋다.

Repository mirror

저장소 복사

git clone --mirror [가져올 URL]
git push --mirror [가져욜 URL]

# git remote -v 
원격지 저장소 주소 확인

# git clone --mirror https://user@a.c.com/maypp/test.git
먼저 옮길 내용을 클론으로 받는다.

올릴 곳의 주소로 설정
# git remote set-url --push origin http://local.com/mobile/android.git
# git push --mirror
이제 로컬의 내용을 변경된 주소로 올린다.

Tag

태그는 버전명을 주거나 할 때 지정해 준다.

  • 먼저 checkout으로 받고, 그 안으로 들어가서 작업한다.
  • 현재 갖고 있는 태그 목록
git tag
  • 현재 받은 checkout에 tag를 만들어 걸기
git tag v1.0
git push origin v1.0
-- 이렇게 해서 서버로 올린다.
  • 태그로 받기
git checkout v1.0
  • 태그 삭제
git tag -d v1.0

-태그 v.1.0을 수정할 때는 1.1 브랜치를 만들어서 작업

태그로 가져와서
git checkout v1.0
브랜치를 만들고
git branch 1.1
해당 브랜치로 전환(이걸 안해주면 소스 날릴 수도)
git checkout 1.1
수정작업
git add -u
git commit -m "patch 1.1"
git push

-master로 위 브랜치 합치기

마스터로 가서
git checkout master
브랜치 1.1을 가져와 머지함
git merge 1.1
git status
충돌파일 편집 수정
git add -u
git commit -m "merge 1.1"
git push
태그를 추가
git tag v4.0
git push origin v4.0

Author : crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Ubuntu18/tomcat8 setup  (0) 2019.11.08
VI 사용법  (0) 2015.06.02
반응형
tomcat_setup

Tomcat 8 install

Ubuntu 기준으로 tomcat8 설치하기

JDK8

$ apt-cache search openjdk-8
$ apt-get install openjdk-8-jdk
$ java -version
openjdk version 1.8.0_222

설치 경로 확인

$ upate-alternatives --list java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
$ cd /usr/lib
$ ln -s jvm/java-8-openjdk-amd64 java
$ ls /usr/lib/java

tomcat8

tomcat은 패키지를 apt-get으로 설치하면 자동으로 설정이 되는 장점이 있지만, 수동으로 받아서 설치하는 것이 좋다. (개인 취향)
수동으로 하는 것은 설치 경로나 구성 등을 본인에 맞게 할 수 있다.

간략 버전 (빠른 설치)

sudo apt-get install tomcat8
ufw allow 8080
service tomcat8 start
끝

수동 설치
http://tomcat.apache.org
홈페이지에서 원하는 버전의 다운로드 URL을 복사한다.

# cd /usr
# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
# tar xvfz apache*.gz
# ln -s apache-tomcat-8.5.9 tomcat
# cd /usr/tomcat/bin
# ./version.sh
Apache Tomcat/8.5.9

환경 설정

  • 방화벽 오픈
    ufw allow 8080
  • 환경 변수
$ vi /etc/profile
export JAVA_HOME=/usr/lib/java
export CATALINA_HOME=/usr/tomcat
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar 

$ source /etc/profile
  • 구동 테스트
    cd /usr/tomcat/bin
    ./startup.sh
    netstat -ant | grep 8080
    ps -ef | grep tomcat

브라우저에서 http://IP:8080 으로 접속하여 페이지가 뜨는지 확인한다.

  • 테스트 종료
    ./shutdown.sh

서비스 등록

  • 계정 생성
groupadd tomcat
useradd -M -s /bin/nologin -g tomcat -d /usr/tomcat tomcat
cd /usr/
chown -R tomcat.tomcat apache-tomcat-8.5.9
  • 서비스 등록
root@blockchain:/etc/systemd/system# cat tomcat.service 
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/lib/java"
Environment="CATALINA_PID=/usr/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/usr/tomcat"
Environment="CATALINA_BASE=/usr/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

ExecStart=/usr/tomcat/bin/startup.sh
ExecStop=/usr/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

위와 같이 파일을 작성하고
systemctl daemon-reload

서비스 구동

service tomcat status
service tomcat start

부팅시 자동시작 스크립트

/etc/init.d에 tomcat 파일을 아래와 같이 만들고
chomd 755 tomcat으로 권한을 설정한다.
JAVA_HOME, CATALINA_HOME, tomcat 계정, 디렉터리를 잘 설정한다.

#!/bin/sh
#
# /etc/init.d/tomcat -- startup script for the Tomcat 8 servlet engine
#
# Modified init-Script from Ubuntu Tomcat init-script
#
#
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Tomcat.
# Description:       Start the Tomcat servlet engine.
### END INIT INFO

set -e

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/tomcat
NAME=tomcat
DESC="Tomcat servlet engine"
DEFAULT=/etc/default/$NAME
JVM_TMP=/tmp/tomcat-tmp

if [ `id -u` -ne 0 ]; then
        echo "You need root privileges to run this script"
        exit 1
fi

# Make sure tomcat is started with system locale
if [ -r /etc/default/locale ]; then
        . /etc/default/locale
        export LANG
fi

. /lib/lsb/init-functions

if [ -r /etc/default/rcS ]; then
        . /etc/default/rcS
fi


# The following variables can be overwritten in $DEFAULT

# Run Tomcat 8 as this user ID and group ID
TOMCAT_USER=tomcat
TOMCAT_GROUP=tomcat

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/java"

# Look for the right JVM to use
for jdir in $JDK_DIRS; do
    if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then
        JAVA_HOME="$jdir"
    fi
done

export JAVA_HOME=/usr/lib/java

# Directory where the Tomcat binary distribution resides
CATALINA_HOME=/usr/$NAME

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/usr/$NAME

# Use the Java security manager? (yes/no)
TOMCAT_SECURITY=no

# Default Java options
# Set java.awt.headless=true if JAVA_OPTS is not set so the
# Xalan XSL transformer can work without X11 display on JDK 1.4+
# It also looks like the default heap size of 64M is not enough for most cases
# so the maximum heap size is set to 128M
if [ -z "$JAVA_OPTS" ]; then
        JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"
fi

# End of variables that can be overwritten in $DEFAULT

# overwrite settings from default file
if [ -f "$DEFAULT" ]; then
        . "$DEFAULT"
fi

if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then
        log_failure_msg "$NAME is not installed"
        exit 1
fi

POLICY_CACHE="$CATALINA_BASE/work/catalina.policy"

if [ -z "$CATALINA_TMPDIR" ]; then
        CATALINA_TMPDIR="$JVM_TMP"
fi

# Set the JSP compiler if set in the tomcat.default file
if [ -n "$JSP_COMPILER" ]; then
        JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=\"$JSP_COMPILER\""
fi

SECURITY=""
if [ "$TOMCAT_SECURITY" = "yes" ]; then
        SECURITY="-security"
fi

# Define other required variables
CATALINA_PID="/var/run/$NAME.pid"
CATALINA_SH="$CATALINA_HOME/bin/catalina.sh"

# Look for Java Secure Sockets Extension (JSSE) JARs
if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then
    JSSE_HOME="${JAVA_HOME}/jre/"
fi

catalina_sh() {
        # Escape any double quotes in the value of JAVA_OPTS
        JAVA_OPTS="$(echo $JAVA_OPTS | sed 's/\"/\\\"/g')"

        AUTHBIND_COMMAND=""
        if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
                JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
                AUTHBIND_COMMAND="/usr/bin/authbind --deep /bin/bash -c "
        fi

        # Define the command to run Tomcat's catalina.sh as a daemon
        # set -a tells sh to export assigned variables to spawned shells.
        TOMCAT_SH="set -a; JAVA_HOME=\"$JAVA_HOME\"; source \"$DEFAULT\"; \
                CATALINA_HOME=\"$CATALINA_HOME\"; \
                CATALINA_BASE=\"$CATALINA_BASE\"; \
                JAVA_OPTS=\"$JAVA_OPTS\"; \
                CATALINA_PID=\"$CATALINA_PID\"; \
                CATALINA_TMPDIR=\"$CATALINA_TMPDIR\"; \
                LANG=\"$LANG\"; JSSE_HOME=\"$JSSE_HOME\"; \
                cd \"$CATALINA_BASE\"; \
                \"$CATALINA_SH\" $@"

        if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
                TOMCAT_SH="'$TOMCAT_SH'"
        fi

        # Run the catalina.sh script as a daemon
        set +e
        touch "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
        chown $TOMCAT_USER "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
        start-stop-daemon --start -b -u "$TOMCAT_USER" -g "$TOMCAT_GROUP" \
                -c "$TOMCAT_USER" -d "$CATALINA_TMPDIR" \
                -x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
        status="$?"
        set +a -e
        return $status
}

case "$1" in
  start)
        if [ -z "$JAVA_HOME" ]; then
                log_failure_msg "no JDK found - please set JAVA_HOME"
                exit 1
        fi

        if [ ! -d "$CATALINA_BASE/conf" ]; then
                log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE"
                exit 1
        fi

        log_daemon_msg "Starting $DESC" "$NAME"
        if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null; then

                # Regenerate POLICY_CACHE file
                umask 022
                echo "// AUTO-GENERATED FILE from /opt/tomcat/" \
                        > "$POLICY_CACHE"
                echo ""  >> "$POLICY_CACHE"
                cat $CATALINA_BASE/conf/*.policy \
                        >> "$POLICY_CACHE"

                # Remove / recreate JVM_TMP directory
                rm -rf "$JVM_TMP"
                mkdir -p "$JVM_TMP" || {
                        log_failure_msg "could not create JVM temporary directory"
                        exit 1
                }
                chown $TOMCAT_USER "$JVM_TMP"

                catalina_sh start $SECURITY
                sleep 5
                if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                        --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                        >/dev/null; then
                        if [ -f "$CATALINA_PID" ]; then
                                rm -f "$CATALINA_PID"
                        fi
                        log_end_msg 1
                else
                        log_end_msg 0
                fi
        else
                log_progress_msg "(already running)"
                log_end_msg 0
        fi
        ;;
  stop)
        log_daemon_msg "Stopping $DESC" "$NAME"

        set +e
        if [ -f "$CATALINA_PID" ]; then
                start-stop-daemon --stop --pidfile "$CATALINA_PID" \
                        --user "$TOMCAT_USER" \
                        --retry=TERM/20/KILL/5 >/dev/null
                if [ $? -eq 1 ]; then
                        log_progress_msg "$DESC is not running but pid file exists, cleaning up"
                elif [ $? -eq 3 ]; then
                        PID="`cat $CATALINA_PID`"
                        log_failure_msg "Failed to stop $NAME (pid $PID)"
                        exit 1
                fi
                rm -f "$CATALINA_PID"
                rm -rf "$JVM_TMP"
        else
                log_progress_msg "(not running)"
        fi
        log_end_msg 0
        set -e
        ;;
   status)
        set +e
        start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null 2>&1
        if [ "$?" = "0" ]; then

                if [ -f "$CATALINA_PID" ]; then
                    log_success_msg "$DESC is not running, but pid file exists."
                        exit 1
                else
                    log_success_msg "$DESC is not running."
                        exit 3
                fi
        else
                log_success_msg "$DESC is running with pid `cat $CATALINA_PID`"
        fi
        set -e
        ;;
  restart|force-reload)
        if [ -f "$CATALINA_PID" ]; then
                $0 stop
                sleep 1
        fi
        $0 start
        ;;
  try-restart)
        if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
                --user $TOMCAT_USER --exec "$JAVA_HOME/bin/java" \
                >/dev/null; then
                $0 start
        fi
        ;;
  *)
        log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
        exit 1
        ;;
esac

exit 0

Author: crazyj7@gmail.com

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Git 사용법_요약  (0) 2019.12.16
VI 사용법  (0) 2015.06.02
반응형
  • vi 시작
    vi filename ; 파일열기, 작성
    vi +10 filename ; 파일 열고 n행으로 이동
    vi +/"hello" filename ; 파일 열고 hello 문자열로 이동
    vi -r filename ; 손상된 파일 복구
    view filename ; 읽기 전용 모드로 파일 열기
    !vi ; 마지막으로 vi 실행했던 커맨드 다시 실행하기
    vi f\[TAB\] ; f로 시작하는 파일명을 선택하기.  \[TAB\]을 더 누르면 f로 시작하는 파일명들을 모두 보여줌.

    * ^M 문자 없애기 (DOS 포맷 텍스트파일을 linux에서 열 때 발생)
    :%s/컨트롤+V누르고 M 또는 엔터//g
    (가끔 터미널에 따라 안될 수도 있음.(단축키가 대신 먹을 때도 있음). 그 경우에는 키 입력을 컨트롤+V누르고 엔터키를 눌러서 대체할 수 있음.)
  • VI (ESC 키 누른 이 후에 커맨드 모드)
    i 현재위치에서 삽입  
    I 현재줄의 처음 위치에서 삽입  
    a 현재 위치에서 추가  
    A 현재줄의 끝 에서 추가  
    o 새로운 한 줄을 커서 아래줄에 연다.  
    O 새로운 한 줄을 커서 위줄에 연다.  
    S 줄을 지우고 삽입모드로  
    R 현재 위치에서 Relpace 모드로  
    J 다음줄과 현재줄을 합친다.  
    ~ 대문자<->소문자  
    . 마지막 명령을 반복한다  
    u (<-> CTRL-R) 마지막 수정한 것을 취소한다.  
    U 줄을 처음 상태로 복구한다.  


-edit-  
cw 한 단어  
2cw or c2w 두 단어  
cc 한 행  
c$ or C 커서 위치에서 행의 끝까지  
cO 커서 위치에서 행의 처음까지  
r 한 문자 변경

-delete-  
dw 한 단어  
2dw or d2w 두 단어  
dd 한 행  
d$ or D 커서 위치에서 행의 끝까지  
dO 커서 위치에서 행의 처음까지  
x (del) or X(bs) 한 문자 삭제

- yanking, copy -  
yw 한 단어  
2yw or y2w 두 단어  
yy 한 행 복사 to clipboard  
3yy ; 세줄 복사 (앞에 복사할 수만큼입력)

y$ or Y 커서 위치에서 행의 끝까지 !!!!  
yO 커서 위치에서 행의 처음까지  
y1 or yh 한 문자 변경  
p ; paste 붙여넣기 (현재 줄 아래에 )  
P ; 현재 커서 윗줄로 삽입

- 커서 이동 - 
h, j, k, l 좌, 하, 상, 우  
\+ or \[enter\] 다음줄의 첫번째 문자로  
\- 이전줄의 첫번째 문자로  
e, E 단어의 끝으로  
w, W 다음 단어로  
b, B 이전 단어로  
$ 행의 끝으로  
0 행의 처음으로 ( 'A' 인 경우 A앞으로 커서이동)  
^ 행의 처음으로 ( 'A' 인 경우에도 맨앞으로 커서이동)  
), ( 다음, 이전 문장의 처음으로  
}, { 다음, 이전문단의 처음으로  
\]\], \[\[ 다음, 이전 구절의 처음으로

^F 한 화면 앞으로 스크롤 (means CTRL-F)  
^B 한 화면 뒤로 스크롤  
^D 반 화면 앞으로 스크롤  
^U 반 화면 뒤로 스크롤  
^E 한 줄 앞으로 스크롤  
^Y 한 줄 뒤로 스크롤  
H 화면의 맨 위줄로 ( nH인 경우 맨 위에서 n행 밑으로 )  
M 화면의 중간 줄로  
L 화면의 맨 아래줄로 ( nL인 경우 맨 밑에서 n행 위로 )

- 검색, 이동 -

/pattern 문자열의 처음에서 앞으로 검색  
?pattern 문자열의 처음에서 뒤로 검색  
n 검색을 다시 반복 (같은 방향)  
N 검색을 다시 반복 (반대 방향)  
fx 현재 줄에서 x가 있는 곳으로 이동 (앞으로)  
Fx 현재 줄에서 x가 있는 곳으로 이동 (역방향)  
tx n행 밑에서 x가 있는 곳으로 이동  
Tx n행 위에서 x가 있는 곳으로 이동  
; 줄에서 찾기를 같은 방향으로 반복  
, 줄에서 찾기를 반대 방향으로 반복  
nG, :n 행 이동 n번째 줄로 이동 (n이 생략되면 마지막줄로) --변환자 주: 이  
기능은 :n 으로 하는것이 편합니다 :)  
G : 마지막 줄로 이동  
nl 열 이동 (n이 생략되면 처음 열로)  
\* 현재 커서가 위치한 단어 찾기 (앞방향)  
\# 현재 커서가 위치한 단어 찾기 (역방향)

mx 현재 위치를 x 이름의 마크로 저장  
\`x 마크한 위치(행, 열)로 이동  
'x 마크한 줄로 이동  
\`\` 이전에 마크한 위치로 이동  
'' 이전에 마크한 줄로 이동

\+ c 코드 분석기
  • vi 기타 커맨드
블록 지정 하여 복사  
    v , 커서 이동 하면 문자 단위 블록 지정. y하면 복사 or x하면 잘라내기. 붙이기는 p. 삭제는 d  
    대문자 V, 커서 이동 하면 라인 단위 블록 지정.

{, } 문자에서 %를 누르면 {} 단위를 모두 선택함.  
^V ; 사각형 형태의 블록 지정  
(windows gvim에서는 ^Q 임.)

+ 쉘로 나갔다가 돌아오기.  
^z 로 나가서 fg 커맨드로 돌아올 수 있다.  
\+ 여러 창으로 작업하기 (screen 유틸)  
screen에서는 C-a S 로 창을 쪼개고  
C-a 으로 창 전환.  
C-a c로 쪼개진 창에 쉘 띄운다.

-- 기타 커맨드

:set nu = set number ; 라인 넘버 보이기  
:q ; 종료  
:qa! ; 강제 종료  
:ZZ ; 저장 후 종료.

--gui에서 beep음 끄기  
:xset b off

-cui에서 끄기  
setterm -blength 0  
setterm -bfreq 10 (작은 소리로 변경)

-- copy & paste  
[숫자]+yy -> p or P or shift+insert

-- delete  
[숫자]+dd ; 행 삭제  
[숫자]+x ; 문자 삭제

-- 반복  
. ; 방금한 것을 반복

-- edit 모드

I ; 현재 첫부분에 편집  
i ; 현재 위치에서 편집  
O ; 윗줄삽입  
o ; 아랫줄 삽입

--검색  
/[검색문자열]

-- 이동  
^+F ; (아래로)  
^+B ; (상위)

-특정 라인으로 이동  
[라인번호]G  
$는 마지막을 의미.

-첫라인으로 이동 ; 1G, 또는 gg  
-마지막라인으로 이동 ; $g 또는 G  
-undo = u  
-redo = ^+r

-- replace ; subsitute  
:%s/[검색어]/[변경어]/g  
:[시작행],[끝행]s/[검색어]/[변경어]/g

-- 예제  
ex) , 를 엔터로 변경  
:%s/,/[변경값]/g  
변경값에 Ctrl+V+Enter 입력 ==> ^M으로 보임. (터미널 클라이언트에 따라 안될 수도 있음. (그럴 경우, ^+V+M 으로 입력?))

ex) 특정 단어가 있는 줄 지우기  
:g/[검색단어]/d

-   여러 문서 편집  
    :args (확인)  
    :n (다음)  
    :3n (3개 스킵 다음)  
    :N (이전)  
    :prev
-   현재 라인에서 특정단어 앞까지 삭제  
    d/\[특정단어\]

:= 현재 행번호 출력

> > 들여쓰기 (tab 추가) ^t(삽입모드시)  
> > << 당겨 쓰기 ^d(삽입모드시)

-   빈 라인 삭제  
    :g/^$/d  
    :%s/^\n//g

-   VIM에서 del, bs 키 입력 설정  
    .vimrc 에 t_kb, t_kD 를 입력하기 위해서 아래와 같이 하면 된다.  
    set t_kb=^H  
    set t_kD=^?  
    [ctrl] + [v],[h] : ^H 가 입력됨  
    [ctrl] + [v],[backspace] : ^? 가 입력됨
  • .exrc 예제

set nu
set autoindent 
set cindent 
set showmatch 
set ts=4
  • 홈디렉터리에 .vimrc 예제

set nocompatible " 오리지날 VI와 호환하지 않음  
set autoindent " 자동 들여쓰기  
set cindent " C 프로그래밍용 자동 들여쓰기  
set smartindent " 스마트한 들여쓰기  
set wrap  
set nowrapscan " 검색할 때 문서의 끝에서 처음으로 안돌아감  
set nobackup " 백업 파일을 안만듬  
set visualbell " 키를 잘못눌렀을 때 화면 프레시  
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸) 표시  
set shiftwidth=4 " 자동 들여쓰기 4칸  
set number " 행번호 표시, set nu 도 가능  
set fencs=ucs-bom,utf-8,euc-kr.latin1 " 한글 파일은 euc-kr로, 유니코드는 유니코드로  
set fileencoding=utf-8 " 파일저장인코딩  
set tenc=utf-8 " 터미널 인코딩  
set expandtab " 탭대신 스페이스  
set hlsearch " 검색어 강조, set hls 도 가능  
set ignorecase " 검색시 대소문자 무시, set ic 도 가능  
set tabstop=4 " 탭을 4칸으로  
set lbr  
set incsearch " 키워드 입력시 점진적 검색  
syntax on " 구문강조 사용  
filetype indent on " 파일 종류에 따른 구문강조  
set background=dark " 하이라이팅 lihgt / dark  
colorscheme desert " vi 색상 테마 설정  
set backspace=eol,start,indent " 줄의 끝, 시작, 들여쓰기에서 백스페이스시 이전줄로  
set history=1000 " vi 편집기록 기억갯수 .viminfo에 기록

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Git 사용법_요약  (0) 2019.12.16
Ubuntu18/tomcat8 setup  (0) 2019.11.08

+ Recent posts