조건문 작성 시

1. 

[ <공백> <내용><공백>]

ex) [ -z "$VAR" ] [ , ] 은 내용과 공백으로 떨어져 있어야 한다.

 

2. 

변수는 반드시 " " 로 감싼다.

ex) [ -z "$VAR" ]

 

3. 

변수형에 맞는 연산자를 사용한다.

 

문자열 비교

연산자 예시 의미
-z if [ -z "$VAR" ] $VAR 변수에 값이 없는 경우 true
-n if [ -s "$VAR" ] $VAR 변수에 값 있는 경우 true
= if [ "$VAR1" = "$VAR2" ] VAR1 VAR2 변수가 같은 경우 true
!= if [ "$VAR1" != "$VAR2" ] VAR1 VAR2 변수가 다른 경우 true

 

정수 비교

연산자 예시 의미
-eq if [ "$VAR1" -eq "$VAR2" ] 
if [ "$VAR1" -eq 10 ]
VAR1이 VAR2과 같으면 true
VAR1이 10이면 true
-ne if [ "$VAR1" -nq "$VAR2" ]  VAR1이 VAR2과 같지 않으면 true
-le if [ "$VAR1" -le "$VAR2" ]  VAR1이 VAR2 보다 작거나 같으면 true
-lt if [ "$VAR1" -lt "$VAR2" ]  VAR1이 VAR2 보다 작으면 true
-ge if [ "$VAR1" -ge "$VAR2" ]  VAR1이 VAR2 보다 크거나 같으면 true
-gt if [ "$VAR1" -gt "$VAR2" ]  VAR1이 VAR2 보다 크면 true

파일관련 비교

연산자 예시 의미
-e  if [ -e "./test" ] test가 존재하면 true
-f if [ -f "./test" ] test가 파일이면 true
-d if [ -d "./test" ] test가 디렉토리면 true
-s if [ -s "./test" ] test의 사이즈가 0이 아니면 true
-r if [ -r FILE ] FILE의 읽기 권한이 있으면 true
-w if [ -w FILE ] FILE의 쓰기 권한이 있으면 true
-x if [ -x FILE ] FILE의 실행 권한이 있으면 true
-L if [ -L FILE ] FILE이 심볼릭 링크면 true
-nt if [ "test1" -nt "test2" ] test1이 test2보다 최신이면 true
-ot if [ "test1" -ot "test2" ] test1이 test2보다 오래되었으면 true

논리 연산

연산자 예시 의미
&& if [ "$VAR1" = "A"] || [ "$VAR2" = "B" ]  VAR1이 A이고 VAR2가 B이면 true(and)
|| if [ "$VAR1" = "A"] || [ "$VAR1" = "B" ]  VAR1 이 A거나 B이면 true (or)
! if [ ! "$VAR" = "test" ] VAR가 test가 아닐때 true (not)

'Linux' 카테고리의 다른 글

ulimit -a  (0) 2025.09.11
차단 IP 조회 쉘 스크립트  (1) 2025.08.11
/run,tmpfs, journalctl  (0) 2025.03.19
자바 버전 설정 alternatives  (0) 2025.03.11
서버 재부팅시 특정 사용자로 스크립트 실행 crontab  (0) 2025.02.19

갑자기 서비스가 뻗어버리는 일이 발생했다.

웹 콘솔로도 접근이 되지 않아

재부팅을 진행했는데 네트워크가 붙지 않았다.

 

네트워크가 down 되어 있어서 급하게 재 기동을하고 원인을 파악하려 로그를 확인하려 하니

재부팅 되어 로그가 날아갔다.

 

로그의 경로는 

journalctl --verify

#PASS: /run/log/journal/22b3e1e3130c45978071f903c5b6cf5d/system.journal 

 

/run 은

시스템 부팅 중에만 사용되는 임시 파일들을 저장하는 디렉토리,

/tmpfs 라고 하는 RAM 기반 메모리 파일시스템에 위치하여 재부팅시 데이터가 사라짐

 

journalctl의 설정에서 

storage의 설정값을

Storage=auto 에서 persistent 로 변경하면

로그를 /var/log/journal/에 저장하여 재부팅 후에도 유지

 

값 변경후 데몬 재시작

systemctl restart systemd-journald

 

 

 

 

 

개발 환경이나 테스트 환경은 매일 배포가 돌아가고 있는 상황에

개발 환경을 쿠버네티스로 전환하였더니 문제가 발생했다.

 

톰캣 기동 중에 참조하는 소스파일에 변화가 생겨 파드가 멈추는 현상이었다.

톰캣의 app base로 지정한 폴더와 nas가 nfs로 마운트 되어있다보니

실시간으로 배포가 반영되어 생기는 현상이다.

 

 

이를 해결하기 위해 중요하게 생각했던 점은

 

1. 배포가 완료되면 파드가 업데이트

2. 서비스에는 영향이 없어야함

 

이렇게 2가지 였다.

 

모든 파드가 연결이 죽는 경우를 제외하고 다른 문제가 있는지 확인해보았다.

 

톰캣 기동시간이 400초에서 500초 정도로 상당히 긴것을 확인했다(최대는 600초이상)

Probe의 설정값에 맞지 않아 재시작하는 경우도 발생했다.

톰캣 기동시에 소스 파일을 스캔하고 파싱하는 과정이 상당히 오래걸리는 것을 확인했다.

소스 파일이 있는 디렉토리가 nas와 마운트 되어 있다 보니

 

단순히 cat 명령어로 파일목록을 읽기만 하는 작업도

컨테이너 이전의 환경과 비교하면 6배나 느렸다.

 

 

고민하던 중에

airflow가 DAG파일을 git에서 pull하는 방식이 생각났다.

airflow에서는 init container를 이용하여 기동시에 git에 있는 DAG파일을 가져오고

sidecar를 이용해 특정 주기마다 체크하여 추가되거나 변경사항이 생긴 DAG파일을 가져온다.

 

init container가 git에서 소스를 받아오면 emptyDir과 마운트된 폴더에 소스를 이동시키고

main container가 emptyDir의 그 폴더에 마운트하여 옮겨진 소스파일을 사용하는 방식이다.

init container, sidecar container, tomcat container는 다 같은 파드에 있다.

위와 같이 init container로 pull을 받아 emptyDir storage로 넘기고

was container에서는 emptyDir과 AppBase 폴더를 마운트하는 방식이다.

같은 파드 내부에 있다보니 톰캣이 소스파일을 스캔하거나 파싱하는 속도가 비약적으로 상승했다.

646초에서 189초로 약 70%정도 감소

 

배포 후 파드가 새로 생성될 때도

기존의 파드는 각자의 소스파일을 갖고 있어 영향을 미치지 않았다. 

alternatives --install /usr/lib/jvm/jre-1.8.0 jre_1.8.0 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 1

 

alternatives --install <java에서 직접 사용할 링크> </etc/alternatives 에 생성 될 링크 이름> <생성될 링크가 바라볼 실제 프로그램 위치>

 

java에서 사용될 링크 는  /etc/alternatives/생성될 링크 이름

 

 

자바에서 직접 사용할 링크가 -> /etc/alternatives/생성 으로 수정

alternatives --install /usr/bin/jre jre /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.el8.x86_64/jre/bin/java 1

 

 

 

 

java

alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/bin/java 1

alternatives --set java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/bin/java

 

jre

alternatives --install /usr/bin/jre java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 1

alternatives --set jre /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 

 

jre_1.8.0

alternatives --install /usr/lib/jre_1.8.0 jre-1.8.0 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 1

alternatives --set jre_ /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 

 

jre_1.8.0_openjdk

alternatives --install /usr/lib/jvm/jre-1.8.0-openjdk jre_1.8.0_openjdk /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 1

alternatives --set jre_1.8.0_openjdk /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 

 

 

jre_openjdk

alternatives --install /usr/lib/jvm/jre-openjdk jre_openjdk /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 2

alternatives --set jre_openjdk /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre 

 

 

+ Recent posts