반응형
Ether01getset

smart contract / solidity 맛보기

온라인 solidity 개발 테스트 사이트에 접속한다.
https://remix.ethereum.org/

  • 코드를 작성한다.
    단순하게 integer값을 set하고 get하는 API 2개가 있다.
    image

  • 컴파일 한다.
    image

  • Deploy를 한다.
    image

  • 생성된 contract에서 각각의 메소드를 테스트해 볼 수 있다. 위에서는 100을 set하고 get으로 100이 나오는 것을 확인하였다.

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
이더리움개발 환경 준비  (1) 2019.11.10
반응형
Ethe00_Setup

Etherium

이더리움 주소

  1. 개인키 생성
  2. 개인키에서 공개키 생성
  3. keccak256으로 공개키의 해시값 생성
  4. 해시값에서 뒤쪽 20바이트를 이더리움 주소로 사용한다.

계정

  1. 외부 소유계정 (EOA)
    다른 계정과 이더 송수신 및 컨트랙트에 트랜잭션 전송도 가능

  2. 컨트랙트 계정
    개인키가 없다. 스마트계약을 블록체인에 배포시 생성됨.
    다른 계정과 이더 송수신 가능.
    코드를 감고 있다.
    EOA나 다른 컨트랙트의 영향으로 트랜잭션을 발생시킬 수 있다.

지갑

이더리움 계정을 저장하고 관리
여러 계정을 관리하고 트랜잭션에 서명, 잔고 추적 등.

가스

스마트 계약 배포, 트랜잭션 실행등에 비용이 소모된다. 채굴자에게 이더를 지불해야한다. 트랜잭션에 얼마나 많은 단위연산이 포함되는지에 따라 비용이 결정됨. 연산의 단위를 가스라고 한다.

가스 가격

트랜잭션 생성자가 원하는 가스 가격을 정할 수 있다. 가스당 3wei 처럼 설정한다. 설정한 가스가격이 높을 수록 트랜잭션 처리 속도가 빠르다. 채굴자들이 높은 가격순으로 처리하기 때문.

가스 한도

트랜잭션 수행 최대 금액을 지정할 수 있다. 블록가스 한도와 다르다.

바이트 코드

스마트 계약 코드는 solidity 언어로 작성 EVM 바이트코드로 컴파일하여 EVM(이더리움 VM)에서 실행된다.

게스(Geth)/패리티(Parity) 클라이언트

geth는 이더리움재단에서 제공하는 공식 클라이언트. (Go로 개발). geth는 블록체인의 복사본을 최신 상태로 유지하고 위해 계속 통신한다. 블록을 채굴하고, 블록체인에 트랜잭션을 추가하고 검증하고 실행한다. API를 제공하기도 한다.

Web3JS

이더리움과 상호작용하는 javascript library.

가나슈. 메모리블록체인 개발테스트
https://www.trufflesuite.com/ganache

지갑관리
https://metamask.io/

메인넷 모니터링
https://etherscan.io/

https://www.etherstudy.net/geth.html

geth 다운로드 설치

https://geth.ethereum.org/downloads/

> geth --dev console
> eth.blockNumber

가나슈설치

Ganache
https://www.trufflesuite.com/ganache
또는
https://github.com/trufflesuite/ganache/releases

온라인 solidity 개발

https://remix.ethereum.org/#optimize=false&evmVersion=null

윈도우/linux solidity compiler

https://github.com/ethereum/solidity/releases

https://github.com/ethereum/solidity/releases/download/v0.5.12/solidity-windows.zip

가나슈가 개발 테스트시에는 빠르다. 추천! (단, 키스토어가 없다. 개인키 접근이 필요하면 복호화된 스트링을 복사해서 사용한다. UI에 열쇠모양 클릭.)

geth는 메모리를 많이 먹어서 느림. 대신 키스토어에 개인키 저장.

py-solc 모듈이 solidity 여러가지 버전에 대해서 잘 지원이 안되는 듯함. python내에서 source compile시도시 에러발생.
커맨드로 빌드하여 output을 파일에 생성하고, 그 파일을 파이썬에서 읽어서 설정하는 방식으로 해야 할 듯 하다.

solc 컴파일러는 버전에 따라 다르니 주의가 필요하다. ubuntu에서 구버전 solc 를 설치하려면?

우분투에서 apt-get 으로 설치하면 최신버전의 solc가 설치된다.
구버전을 사용하려면 위 사이트에서 구버전 soliidity-ubuntu-trusty-clang.zip을 받아서 설치한다.
실행시 libz3 에러가 발생?? 하면 아래와 같이 라이브러리를 설치해 준다. 그 외에도 여러가지 개발툴들을 설치한다.
apt-get -y install build-essential cmake g++ gcc git unzip
apt-get install libz3-dev
solc --version

강좌

https://www.ethereum.org/ko/developers/#%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C

https://solidity-kr.readthedocs.io/ko/latest/

https://winterj.me/smart-contract-with-python/


실습

  • geth 설치
sudo add-apt-respository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
sudo apt install golang-go

확인
geth version
1.9.6-stable
go version
1.10.4
  • genesis 블록 설정
    genesis.json 파일 생성
$ cat genesis.json 
{
    "config": {
        "chainId": 16,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
        },
    "nonce": "0x0000000000654123",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x00",
    "gasLimit": "0x2db7579a600",
    "difficulty": "0x20",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {}
}
  • difficulty 값은 채굴난이도로 낮을수록 빨리캔다. 위의 설정에서는 32가 된다.
  • geth 접속 후, eth.getBlock(0) 으로 확인할 수 있다.

초기화

현재 폴더에서 chain-data 폴더가 만들어진다. 데이터는 다 그곳에 저장됨. (geth, keystore 등)

geth init genesis.json --datadir chain-data
geth --datadir chain-data console

구동

접속을 쉽게하려면 rpc를 만들어 놓자. 아래와 같은 start.sh 스크립트를 만들어 저장해 두고 실행하자. 기본 포트는 8545인데, 여기서는 8485로 변경하였다. (주의!)
원격에서 계정 unlock을 허용하려면 --allow-insecure-unlock 옵션을 추가한다.

just running...
> geth --datadir ./chain-data console
> 최초 계정을 만들어 주어야 한다. 없으면 마이닝 모드 구동시 
> ether base가 없다고 에러가 남.
> 
> personal.newAccount('pass')
> 파라미터가 암호임. 반복하여 여러개의 계정을 임시로 만들어 본다.
> exit

start with options...
> cat start.sh
geth --rpc --rpcport 8485 --rpccorsdomain "*" --datadir "./chain-data" --port 30303 --nodiscover --rpcapi "db,eth,net,web3" --networkid 15 console
다른예) 위와 같이 실행해서 계정을 만든 다음 다음부터 아래처럼 실행
geth --rpc --rpcport 8545 --rpccorsdomain "*" --datadir "./chain-data" --port 30303 --nodiscover --mine --minerthreads 1 --allow-insecure-unlock --rpcapi "admin,personal,miner,db,eth,net,web3" --networkid 15 console
> ./start.sh
실행하면 메시지와 함께 콘솔이 뜬다.

내가 쓰는 구동 스크립트

> cat start3.sh
> geth --rpc --rpcport 8485 --rpcaddr "0.0.0.0" --rpccorsdomain "*" --datadir "./chain-data" --port 30303 \
--allow-insecure-unlock --mine --minerthreads 5 --identity private_chain \
--rpcapi "personal,miner,admin,db,eth,net,web3" --networkid 15 console
  • 윈도우에서 구동시 CPU100% 먹길래 "minerthreads 1"을 삭제해주니까 CPU가 정상적으로 떨어졌다. (참고) 또는 5나 10정도로 설정한다.
  • 구동해 놓으면 coinbase 계정으로 이더가 알아서 쌓이기 시작한다.
  • 마이닝이 안되면 miner.start(5) 이렇게 쓰레드를 지정해서 시작해 보자.
  • 그래도 마이닝이 계속 안되면, 작업관리자를 띄워서 메모리를 살펴보자. 메모리가 점점 증가하다가 1기가 좀 넘어서 기다리면 그 때 부터 CPU를 막 잡아먹기 시작하면서 마이닝을 할 것이다. 컴퓨터 성능에 따라 마이닝 하는데 시간이 좀 걸릴 수 있으니 기다려라.

로컬의 다른 쉘에서 geth 연결하기

geth 구동시 datadir에 설정된 경로에 geth.ipc라는 파일이 생기는데 그것으로 연결한다.

$ geth attach ./chain-data/geth.ipc
or
$ geth attach http://localhost:8485 (rpc:http://... 이렇게도 가능)
일부 작업이 제한될 수 있다. geth 시작시 옵션 설정이 필요.
  • 간단한 명령어
    eth.accounts : 계정 목록
    eth.blockNumber : 현재 채쿨된 블록 번호
    eth.hashrate
    eth.coinbase : 채굴 보상받을 계정. 디폴트는 eth.accounts[0]
    eth.mining : 마이닝 상태 on/off
    eth.getBalance(account) : 잔고
    eth.getTransaction(tx) : TX 정보
    miner.start() : 함수를 호출하여 마이닝 시작. 파라미터 1,2등 thread개수옵션
    miner.stop() : 마이닝 중지
    miner.setEtherbase() : 채굴 보상 계정 설정
    personal.newAccount(password) : 계정 생성
    personal.unlockAccount(account, password) : 계정 잠금 해제 (송금등 TX발생시 사전필요작업임)

  • 콘솔 연결 후 작업

personal.newAccount('pass')
personal.newAccount('pass')
personal.newAccount('pass')
personal.newAccount('pass')
위와 같이 테스트 계정들을 만들어 준다. 암호는 일단 다 pass로 하였음.
eth.mining : 마이닝 상태 확인. 
miner.start() : 마이닝이 멈춰있으면 마이닝을 시작한다.
잠시 후,첫번째 계정 잔고를확인한다.
eth.blockNumber
eth.getBalance( eth.accounts[0] ) : 0번 사용자 잔고 확인.

계정의 키는 데이터 루트 폴더(chain-data)안에 keystore 폴더에 계정별로 저장되어 있다.

  • 방화벽
    아까 rpc port로 설정했던 포트를 연다.
    ufw allow 8485

  • remix연결
    Env. web3provider
    http://172.16.100.88:8485
    원격 주소로는 접속이 안되는 것인지??? 계속 실패하였음.
    그래서 ssh로 포트 터널링하여 로컬로 연결함. (참고로 서버 ssh포트는 2222로 변경된 상태)
    접속 실패 원인을 찾아보니, rpcaddr을 안 줘서 그런 거였다.

ssh -L 8545:localhost:8485 blockchain@172.16.100.88
   -p 2222

위와 같이 로컬 8545를 원격의 8485로 연결해 놓고, remix에서 web3 provider에 주소를 로컬 주소를 주었다.
http://localhost:8545

  • smart contract deploy (배포)

계정 unlock을 해 주어야 한다 (unlock을 해주지 않으면 deploy나 set이 안된다.)
한 번 해두면 일정시간만 허용되는 것 같고, 시간이 지나면 자동으로 잠긴다.
personal.unlockAccount(eth.accounts[0])
위 커맨드가 작동하지 않는다면, geth 구동 스크립트에 옵션을 추가해 주어야 한다. –allow-insecure-unlock

remix로 contract를 deploy 시도 및 API 테스트를 했는데, 계속 가스 초과 에러가 발생하였다.
여러가지 시도 끝에, solidity compiler 버전을 0.4.23으로 낮추고 deploy를 하니 정상적으로 작동하였다. 계속 삽질을 했다는…
또 어디서는 genesis에 chainId가 0이면 그런 증상이 발생해서 42정도로 설정하여 해결했다는 얘기도 있다. 나의 경우는 chainId 설정을 하지 않았는데( config 필드가 empty) 위와 같이 해결하였음.
잘 안되면 남들하는 버전을 보고 연관되어 돌아가는 버전을 모두 맞춰 시도해보는 것도 좋다.

참고
원격 접속용 geth 구동

$ nohup geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/Blockchain/data_testnet --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --unlock 0,1 --password ~/Blockchain/data_testnet/passwd --verbosity 6 2>> ~/Blockchain/data_testnet/geth.log &

rpc ; http-rpc 활성화
rpcaddr : 접속 가능한 주소 0.0.0.0는 any 허용. 127.0.0.1을 입력하면 로컬호스트에서만 접속 가능. 자신의 IP 주소를 주면 그 IP로 접근이 허용된다.
rpcapi : rpc에서 허용가능한 모듈을 지정. 여기에 miner, personal 등이 들어가면 사용 가능.
unlock : 계정 잠금 해제. geth에서 해당 계정에 암호없이 접근 가능.

많이 쓰는 명령어

잔고 조회
eth.getBalance(eth.accounts[0])

전송 : 10이더를 해당 사용자에게 전송
personal.unlockAccount(eth.accounts[0])
패스워드(pass) 입력

eth.sendTransaction( {from: eth.accounts[0], 
   to:"0xc8cafbebb42f522f040d5690b1b220c3a9aed8f1", 
   value:web3.toWei(10,"ether")})

eth.getBalance("0xc8cafbebb42f522f040d5690b1b220c3a9aed8f1")

마이닝
eth.mining  : 현재 마이닝 상태
miner.start(1)
miner.stop()

계정
eth.accounts : 계정 목록 조회
personal.newAccount('password') : 계정 생성
personal.unlockAccount(eth.accounts[0]) : 잠금해제

SubLimeText 에서 solidity code intelligence 지원

Ctrl+Shift+P를 누르고 install 을 치고 install package 실행
잠시 기다리면, 입력창이 뜸.
ethereum을 입력. Ethereum을 설치
다시 한 번 반복하고 이번엔 EthereumSoliditySnippets를 설치
다시 시작하면 적용 완료.

강좌

https://www.ethereum.org/ko/developers/#%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C

https://solidity-kr.readthedocs.io/ko/latest/

https://winterj.me/smart-contract-with-python/

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
반응형
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

+ Recent posts