본문 바로가기

개발중/참고 기능

Window -> Linux Server 에 .java 파일 업로드 후 실행 시키기.

728x90
반응형

♻ 2021.07.15 시도


내가 만든 데몬 프로세스를 이제 리눅스에 올려야 한다.

 

DY 선배가 이번에는 PUTTY 와 FILRZILLA 를 이용해서 리눅스에 올리는 방법을 알려주신다고 했다.

사실 정말 해보고 싶었던 부분인데,

 

리눅스 서버는 내게 너무 거리가 먼 서버 .. 라서 아직 신비로운 그런 애라서

아직도 내가 잘못만져서 뻥나면 어떡하지 생각이 크지만 일단 하랬으니까 해봐야지. (●ˇ∀ˇ●)


나름 생각 정리 💭

 

1. 만든 demon project 를 파일질라를 통해 리눅스 서버에 업로드 한다.
2. 쁘띠를 통해 demon project 를 crontab 명령어로 실행시킨다.


보통 crontab에 올리는 프로세스들은 /app 경로 밑에 넣어두고 실행 시킨다.

 

리눅스 안에서 명령어 입력할 때 오타 안나게 꼭 조심해서 해야한다.

얼핏하면 알파벳 하나 차이로 다 지워질 수도 있다.


JW 선배는 내가 Crontab 에 대해 일을 하고 있으니 Crontab 프로세스를 돌릴 때는 가급적이면 멀티 프로세스가 되지 않도록 주의하는게 중요하다고 했다.

 

고의적으로 멀티 프로세스를 만들려고 한 경우가 아니라면 멀티 프로세스가 이루어지지 않도록 주의하라고 했다.

 

이유는 메모리,, 침범,, 싸운다,, 부딪친다,, 등등 이 있었다.

자세히 설명해줬는데 기억이 안나는 내가 너무 ,, 안타깝다. 찾아봐야겠다.


DY 선배가 준 회사 LINUX TEST SERVER 계정으로 이제 접속을 하려고 하는데 왜 안되는 걸까 ?

너 왜 오류나는거야 ..?

 

오류 : Connection timed out after 20 seconds of inactivity


첫번째 삽질 사이트


두번째 삽질 사이트


세번쨰 삽질 사이트


네번째 삽질 = > DY 선배 tip 고맙습니다 (´▽`ʃ♡ƪ)

 

 


이제 내 데몬을 Linux 에 올려봐야겠다 .. 

 

내가 실행 시켜야 하는 데몬은 이 경로에 있다.

C:\coding\workspace-spring-tool-suite-4-4.9.0.RELEASE

\Lucy2Daemon\src\main\java\com\rsn\LotteLog\job\SendMailLotteLog.java

 

근데 내가 궁굼한 부분은 이건 그냥 자바 프로젝트이고,

Java Application 버튼으로 실행 시켜 본 적 밖에 없기 때문에 이걸 리눅스에서 어떻게 실행시키지가 일단 제일 궁굼하다.

 

마음 같아서는 내가 매월 1일마다 Java Application 버튼을 눌러주고 싶은 마음도 ,,, ㅎㅎㅎ

아니 그거 귀찮으니까 자동화 시켜야지... ㅎㅎ


 

FilaZilla 로 하면 드래그로 다른 서버끼리 파일을 쉽게 옮길 수 있다는 말은 들었지만

 

내가 올리고자 하는 파일이 아닌걸 잘못 드래그 해서 실수로 다른 프로젝트를 옯겼다.

진짜 이거 정신 차려야겠다.. ㅎ

 

 

그래도 삭제가 가능하다니 이것 참 다행이다.


다시 정신차리고 /app 아래에 Demon 을 업로드 시켰다.

이게 된다는게 일단 신기하다.


JW 선배한테 "선배님 그냥 드래그 하면 파일이 LINUX 서버로 옮겨지는거 맞아요 ?" 라고 질문했더니

 

JW 선배는 예전에 드래그로 파일을 옮기다가 터미널이 꼬여고 서버가 터져서 서버까지 직접가서 해결한 경험을 말해줬다.

되도록이면 업로드 버튼을 이용하라고 했다.


이제 putty 를 써서 LINUX 서버에 접근을 해봐야 겠다.

생각보다 접근이 쉽게 되었다.

이제 실수하면 안되는데... .ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ


우와,,,, 이걸 찾아낸 나도 칭찬하고

잘 올라간 너도 칭찬하고,,,


와,,,, 내가 Linux cmd 를 다루다니...

아직도 경이롭다...


이제 내 눈 앞에 있는 .java 파일만 실행 시키면 되는데

블로그를 보니까 'java 파일명' 을 쓰면 된다고 한다 그래서 나는 아래처럼 써보려고 한다.

 

java SandMailLotteLog 


역시 오류이다.

한번에 될 리가 없지 ㅎㅎ.


컴파일을 해야 하나 ? 싶어서 아래처럼 컴파일 명령어를 써봐야겠다.

 

javac SandMailLotteLog.java 

 

역시나 안되는구나


아싸리 파일에 들어가서 컴파일을 해볼까 ?

그건 아닌거 같다.


블로그에 이리 적혀 있다. 조심스럽게 한번 시도해 볼만 하다.

 

javac -d . SandMailLotteLog.java
java -cp $CLASS_PATH: test.Copy TEST_TEST

 

하지만 안된다.


이 명령어가 맞는거 같다 !!! 왜냐면 내 소중한 코드가 몇개가 나왔다..

그럼 내 코드에 문제가 있다는건데 ..

 

javac -d . SendMailLotteLog.java


뭔가 이 에러를 보니까 내가 실행시킨 파일 위치에서 참조하고 있는 파일들은 더 상위 폴더이기 때문에

"이게 뭔 파일인데" 라고 나한테 시위 하는 것 같다.

그럼 어쩌지 ?

 

error: package com.rsn.LotteLog.service does not exist


블로그에서 내가 찾고 있는 해답을 준 것 같다.

근데 내 경우에 적용을 시키지 못하겠다.


 JW 선배 도움 받아서 해결 / 여기부터 진짜 중요하고 새로운거


내가 일단 공부해서 더 깊게 알아가야 하는 부분

  • maven 
    • 컴파일, 버전관리 등을 자동으로 해주는 애.
    • maven install 을 하면 자동으로 target 아래 jar들이 생성된다.
  • <manifest>
    • jar 파일을 실행 했을 때 처음으로 실행되는 class 를 지정해주는 곳
  • <build>
    • jar 파일을 실행 했을 때 처음으로 실행될 떄 필요한 설정을 해주는 곳
  • 컴파일
    • 컴퓨터가 이해 할 수 있는 언어로 바꾸는 과정
  • 빌드
    • 소스 파일을 실행 가능한 산출물로 만드는 일련의 과정
  • 쉘 스크립트
    • 쉘 스크립트는 쉘에게 무슨 명령들을 실행할지 알려주는 스크립트 파일이다.

내가 하고 있는 프로젝트는 JW 선배가 만든 Demon 을 기반으로 하기 떄문에 이거를 먼저 파악해야 겠다.


Run AS -> maven install -> maven Clean 을 하면 자동으로 target 아래 jar들이 생성된다.

 

 

근데 두가지 jar 파일이 생성이 된다.

용량 차이도 크다.


이유는 아래와 같다.

 

Lucy2Daemon-20210303.1.jar 는 딱 자바 파일만 가지고 생성이 되지만

Lucy2Daemon-20210303.1-jar-with-dependencies.jar 는 pom 에 존재하는 모든 라이브러리 까지 가지고 있기 때문이다.


아래 설정을 보면 제일 먼저 실행되는 곳이 나온다.

 

<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.rsn.ApplicationRun</mainClass>
</manifest>


그럼 ApplicationRun class 의 main 부터 시작을 한다.

main 에서는 아래와 같읕 코드로 시작을 한다.

 

public static void main(String[] args) throws IOException {

    new ApplicationRun().starter(args);
}

 

여기서 중요한데 main 에서는 String[] args 매개변수를 받는다.

여기에는 뭐가 들어있어야 하냐면 phoneNumber, packageAndClass 가 필요하다.

 

String[0] = phoneNumber

String[1] = packageAndClass


근데 args[] 에 어떻게 값을 집어 넣냐면

 

Linux 에서 실행을 할 떄 아래 처럼 명령어를 쓴다.

와 진짜 이게 상상이나 가능한 일인지 몰랐다.

 

오류가 났을 때 연락을 받을 전화번호파일을 실행시킬 class 경로

 

java -jar a.jar 010-0000-0000 com.rsn.LotteLog.job.SendMailLotteLog

 

String[0] = 010-0000-0000

String[1] = com.rsn.LotteLog.job.SendMailLotteLog


어떻게 이렇게 class 를 실행시키고 에러가 난다면 연락을 받을 번호까지 지정할 생각을 한걸까.

내가 개발을 시작하고 들었던 시작점에 대한 의문이 조금 풀리기 시작했다. 


다시 리눅스 서버에 jar 파일을 올리고 실행 시켜봐야겠다.


롸 ??? Manifest 속성이 없다라 ..


내가 jar 파일을 라이브러리까지 몽땅 올렸어야 했나보다..

다시 올리고 다시 해보기.


이제 드디어 java 스러운 에러가 나왔다.

null 이라는데 이건 뭐 찾아보면 될 것 같다.


이상하게 /com/rsn/common 아래 /config 가 없다.

STS 설정 문제 일 수 도 있으니 내일 이클립스로 한번 더 해봐야 겠다.

 

/com/rsn/common/config/application.properties


  2021.07.16 시도


이클립스로 해보니 어제 생성 되지 않던 common 이 생성이 되는것이 확인 되었다.

sts 랑 이클립스랑 무슨 설정 차이가 있는지 확인해봐야 겠다.


잘 생성이 되고 올리니까 mySql connection 에러가 발생했다.


그래서 버전 차이 인가 싶어서 버전을 확인해 보았다.

둘이 달라서 맞춰주려 했는데 이런 그냥 운영 체제가 다르니까 다른것이다.

 

java MYSQL - 5.1.46
linux MYSQL -5.7.34


그래서 경로도 다 찾아 봤는데 경로 문제도 아닌거 같다.


마침 나랑 같은 서버에서 HC 님이 프로세스 돌리고 있다는 이야기를 들어서 연락을해서 조언을 구했는데.

 

대부분 My sql version 차이로 인해서 에러가 난 적은 없다고 했다.

도움을 받아서 해결을 했는데 이 부분이 문제였다.

 


그래서 싸그리 지우고 "외부망 접속" 만 남겼다.

회사 컴퓨터는 window 니까 이게 외부망으로 접속 되고

Linux 는 외부망인데도 불구하고 내부망 접속으로 흘러 갔던 것 같다.

 

dao.ManagerMybatisConnection.getSqlSession("lucy2_outter", MAPPER_PATH) 


그리고 실행했더니 다행이 Connection 에러는 사라졌지만

이번에는 경로 문제가 발생했다 : )

 

프로젝트가 jar 파일로 올라갈 때에 이클립스에서 내가 실행하던 경로랑 똑같을 것이라고 단언했던 내 실수 였다.


난 jar 파일을 열어볼 수 있는지 몰랐지만 어제 JW 선배가 오류가 났을 때 jar 파일을 열고

에러를 찾는 과정을 봐서 그대로 따라했다.

 

원래는 resouse 아래 log 폴더가 존재해야 하는데

jar 파일 아래 최상위로 log 가 있는 것을 보고 이 경로가 내가 생각하는 대로가 아닌 달라질 수 있다는 점을 알게 되었다.


 

운영 서버 경로와 개발서버 경로를 다르게 하는 것을 본적은 있었지만

이해가 잘 되지 않았었는데 오늘 완벽하게 이해가 되었다.


이렇게 바꾸고 실행하니 내가 만든 데몬이 정상적으로 작동하는 것을 확인했다.

 

LINUX 서버 진짜 다루고 싶었었는데,,

다루다니 진짜 신기하다.

 

근데 내 힘으로 성공한건 아니고 세상 여러 사람들 도움 받으면서 해결한 것 같다.

 

나도 얼릉 다른 사람들한테 도움 주는 사람이 되어야지 : )


crontab 

이제 crontab 할 차례이다.

이제 1 분에 한번씩 실행 되게 해야겠다.

 

* * * * * crontab java -jar Lucy2Daemon-20210303.1-jar-with-dependencies.jar 010-8478-6861 com.rsn.LotteLog.job.SendMailLotteLog


헐랭 찾아보니까 스프링에서도 cron 설정이 가능하다. 이 블로그에서 봤는데 너무 신기하구만


지금 내 생각은 ,,.

jar 파일을 sh 로 만드는 것인데 ..

이게 말이 되는거겠지 .. ?


아,,, # 이게 주석인 줄 알았는데,, 주석이 아니었다,, 🙄 ,,,,


jar 파일을 shell 로 만들어야 하는게 내가 해야 하는 일 같다는 확신이 들기 시작했다.

jar -> shell 예제 참고 사이트

nohup 참고 사이트 

 


sh 파일 생성

vi lotteLog.sh


lotteLog.sh 안에 코드 작성.


자꾸 어디 있냐고 물어보는 것 같다.

 

-bash: lotteLog.sh: command not found


위치를 찾아보자.

뭐지 in 안에 () 안에 저기에 lotteLog.sh 이게 다 있다는 걸까

 

which lotteLog.sh
/usr/bin/which: no lotteLog.sh in 

(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/java/jdk1.8.0/bin:/usr/local/tomcat/bin:/root/bin)


조금 가까워지고 있다는 건 내 착각일까..

이거 살짝 괜찮게 적어 놓은거 같은 블로그 기록


헐, 성공을 했다. 문제는 내용물이 문제 였다.

 

더보기
#!/bin/sh
SERVICE_NAME="LotteLog"
PATH_TO_JAR="Lucy2Daemon-20210303.1-jar-with-dependencies.jar 010-8478-6861 com.rsn.LotteLog.job.SendMailLotteLog"
PID_PATH_NAME="./LotteLog.pid"
JAVA_OPT="-Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
			nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
			echo "$SERVICE_NAME 이미 실행되고 있지 않은데 여기를 탄다... 그래서 이해가 안간다 ;;;"
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac

./lotteLog.sh 뒤에 뭐가 붙는지에 따라서 lotteLog.sh 안에서 실행 될 때 

case 문을 탄다는게 나의 생각이다.

 

./lotteLog.sh start

./lotteLog.sh stop

./lotteLog.sh restart


근데 여기서 startr 문을 타는데 else 문을 타는 것이다.

! -f $PID_PATH_NAME 가 false 라는 것이 지금 실행중이라는거 아닐까 ..?

 

    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
            echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..이미 실행 되고 있다고 ..?.."
            nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
            echo "$SERVICE_NAME 이미 실행되고 있지 않은데 여기를 탄다... 그래서 이해가 안간다 ;;;"
        fi
    ;;


else 문에 kill 처리를 해줘야 하나..

kill $PID; 

 

없다는데 왜그럴까 ??


음 그냥 저 처리를 없애버리자.

근거 없는 자신감이 생겼다.

lotteLog.sh 에 너무 필요없는 코드들이 많다는 생각을 헀다.

셀 스크립트 파일을 하나 더 만들어야 겠다 : )

 

vi lotteLog2.sh


와 이게 실행이 되다니.. 

내가 셀스크립트를 만든 ,,,와...우,,,,,와우와우 !!!

#!/bin/sh

SERVICE_NAME="LotteLog2"
PATH_TO_JAR="Lucy2Daemon-20210303.1-jar-with-dependencies.jar 010-8478-6861 com.rsn.LotteLog.job.SendMailLotteLog"
PID_PATH_NAME="./LotteLog2.pid"
JAVA_OPT="-Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"

echo "$SERVICE_NAME Mail Starting..."
nohup java -jar $JAVA_OPT $PATH_TO_JAR >> /dev/null &
echo "$SERVICE_NAME Mail Ending ..."

crontab 까지 설정은 했으나 될란지는 잘 모르겠다.. 


 

728x90
반응형