#사용중인 포트 리스트

lsof -i

 

#특정 포트 사용 여부 확인

lsof -i :9092 

 

sudo lsof -t -i tcp:8080| xargs kill -9

Visual Studio Code에서 

 

 

Command + Shift + P 누르고 

shell command 입력

 

 

터미널에서 아래 명력으로 등록된 쉘 확인

ls -l /usr/local/bin/code

아래와 같이 기본쉘을 지정 후에 초기 파일을 로딩하면 된다.

 

#!/usr/bin/env zsh
test -f ~/.zshrc && . ~/.zshrc

 

test 쉘스크립트에서 아래 두 가지 형태로 사용하고 있습니다.

test expression
혹은
[ expression ]

두번째 방식으로 사용하려면 반드시 [] 대괄호와 expression 사이에는 빈칸이 있어야 합니다.
왜냐하면, '['도 명령문이기 때문입니다.
유닉스 시스템에서는 명령문과 아규먼트 사이에 빈칸이 있어야 합니다.
아래 명령의 결과 긍정이면 '0'이 리턴되고, 부정이면 '1'이 리턴됩니다.

-e 파일이름 - 파일이 존재하는지 여부
-f 파일이름 - 일반파일인지 여부
-b 파일이름 - 파일이 블록파일로 존재하는지 여부
-c 파일이름 - 파일이 캐릭터파일로 존재하는지 여부
-d 파일이름 - 파일이 디렉토리인지 여부점(. 영어로는 dot)은 크게 3가지로 쓰입니다.

1. 숨김(히든) 파일을 만들때 사용하죠
.profile 이러면 ls 에서 안보이고 ls -a 옵션을 줘야 보이죠

2. 쉘의 환경변수를 바꿀 때 사용하더군요
. ~/.profile 이러면 현재 환경변수를 ~/.profile에 설정된 값으로 변경하는 거죠
이 때 앞의 . 은 source의 축약된 표시죠

3. 현재 경로(디렉토리)를 나타내죠
./configure 이러면 현재 /home/oseb/Packages/ffmpeg이라고 하면
/home/oseb/Packages/ffmpeg/configure 라고 하는 걸 줄여서 표시하는 겁니다
부록으로 .. 두 개는 상위 디렉토리를 나타냅니다. 도스에서 dir 하면 보이던게 리눅스에서도 그대롭니다즉, 파일이 없으면 1로 &&에 의해 다음 명령어 수행

 

명령어 연결해서 실행 (  ;   &&   &  )

  • ; - 앞의 명령어가 실패해도 다음 명령어가 실행
  • && - 앞의 명령어가 성공했을 때 다음 명령어가 실행
  • & - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

 

 

. ~/.zshrc

점(. 영어로는 dot)은 Linux에서 크게 3가지로 쓰입니다.

1. 숨김(히든) 파일을 만들때 사용하죠
.profile 이러면 ls 에서 안보이고 ls -a 옵션을 줘야 보이죠

2. 쉘의 환경변수를 바꿀 때 사용하더군요
. ~/.profile 이러면 현재 환경변수를 ~/.profile에 설정된 값으로 변경하는 거죠
이 때 앞의 . 은 source의 축약된 표시

3. 현재 경로(디렉토리)를 나타내죠
./configure 이러면 현재 /home/oseb/Packages/ffmpeg이라고 하면
/home/oseb/Packages/ffmpeg/configure 라고 하는 걸 줄여서 표시하는 겁니다
부록으로 .. 두 개는 상위 디렉토리를 나타냅니다. 도스에서 dir 하면 보이던게 리눅스에서도 그대롭니다

 

스크립트를 실행하는 방법 차이


1. bash 스크립트파일명
2. 스크립트파일명
3. . 스크립트파일명

이렇게 있는데,
1번의 경우는 명시적으로 스크립트를 실행할 쉘을 지정한 경우입니다.
2번의 경우는 현재의 쉘프로그램에서 스크립트를 실행해줍니다.
그러나 이경우는 스크립트파일에 실행속성이 부여되어 있어야 합니다.
3번의 경우는 현재쉘이 bash(혹은 본쉘 호환쉘)일 경우, 스크립트를 실행해줍니다. 즉 본쉘 호환쉘 내부 명령입니다.

1,2번의 경우는 bash혹은 현재쉘에서 자식프로세스를 만들어 스크립트를 실행합니다.
프로세스는 메모리를 각기 따로 할당하기 때문에, 환경변수등의 메모리 영역이 공유되지 않기 때문에,
export 명령등으로 환경변수를 자식프로세스에 전파해야 자식프로세스가 부모프로세스의 환경변수 값을 가지게 됩니다.

3번의 경우는 자식프로세스를 생성하지 않고, 현재의 쉘(본쉘 호환쉘)에서 직접 명령의 해석해 실행하기에,
환경변수등이 그대로 적용됩니다. 쉘프로세스에서 실행하는 것이라 쉘프로세스의 메모리및 환경변수를 사용하는 것이죠.

종합하자면...
1번의 경우는 명시한 쉘의 자식프로세스에서 실행
2번의 경우는 현재의 쉘의 자식프로세스에서 실행
3번의 경우는 현재의 쉘이 직접실행

 

dvd는 블록장치이므로 -b로 체크하면 리턴값은 '0'이 됩니다.

$ test -b /dev/dvd$ echo $?0


console은 캐릭터장치이므로 -c로 체크하면 리턴값은 '0'이 됩니다.

$ test -c /dev/console $ echo $?0


캐릭터나 블록장치를 -f로 체크하면 아래처럼 '1'을 리턴합니다.

$ test -f /dev/console $ echo $?1


-g 파일이름 - SGID가 설정되어있는지 여부
-u 파일이름 - SUID가 설정되어있는지 여부
-k 파일이름 - sticky bit가 설정되어있는지 여부
   sticky bit가 설정된 파일/디렉토리는 생성한 유저만이 삭제할 수 있습니다.

-h 파일이름 - 파일이 심볼릭 링크인지 여부
-L 파일이름 - 파일이 심볼릭 링크인지 여부
     -h와 -L은 동일한 기능을 수행합니다.

-r 파일이름 - 현 프로세스가 파일에 읽기 권한이 있는지 여부.
-w 파일이름 - 파일에 쓰기 권한이 있는지 여부. read-only 파일시스템에서는 쓰기권한이 있어도 쓰기가 안될 수 있습니다.
-x 파일이름 - 파일에 실행 권한이 있는지 여부. 디렉토리에 실행권한이 있으면 cd를 할 수 있습니다.

-p 파일이름 - 파일이 이름있는 파이프인지 여부(FIFO)
-s 파일이름 - 파일사이즈가 0 초과인지 여부
-t FileDescriptor - 파일디스크팁터가 현 터미널에서 열렸는지 여부

표준입력(0)/표준출력(1)/표준에러(2)는 열려있습니다. 3번은 열려있지 않네요.

$ test -t 0
$ echo $?
0
$ test -t 1
$ echo $?
0
$ test -t 2
$ echo $?
0
$ test -t 3
$ echo $?
1

 

file1 -nt file2 - file1이 file2보다 새로운 파일인지 여부(newer than)

$ touch old
$ touch new
$ test old -nt new
$ echo $?
1

위의 예에서 old가 더 새로운 파일은 아니므로 '1'이 리턴되었습니다.

 

file1 -ot file2 - file1이 file2보다 오래된 파일인지 여부(older than)

$ test old -ot new
$ echo $?
0

old가 더 오래된 파일이므로 이번에는 0을 리턴하였습니다.

 

file1 -ef file2 - file1이 file2의 또 다른 이름인지 여부(symbolic link 또는 hard link)

$ ln -s new new.link
$ test new -ef new.link
$ echo $?
0

위처럼 new 파일의 소프트링크 new.link 파일을 만들었습니다.

그리고 -ef 옵션을 사용하여 new와 new.link를 비교하였습니다.

결과는 두 개의 파일이 동일하다는 리턴값 '0'이 나왔습니다.

이는 하드링크에서도 동일합니다.

 

-n String1 - String1의 길이가 0 초과(nonzero)

-z String1 - String1의 길이가 0(zero)

String1 = String2 - String1과 String2가 일치

String1 != String2 - String1과 String2가 불일치

String1 - String1은 NOT NULL

 

Integer1 -eq Integer2 - Integer1과 Integer2는 일치

-ne - 불일치

-gt - 보다 큰

-ge - 크거나 같은

-lt - 보다 작은

-le - 작거나 같은

 

! - 부정

-a - AND

-o - OR(-a 연산자가 -o 보다 우선순위가 높습니다.)

\(Expression\) - '\'과 함께 쓰이는 괄호는 그룹을 지정할 때 사용

 

 

명령어의 반환값

리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다. 예를들어보죠. 

test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요. 성공했을 때 어떻게 되는지 보시죠. 

mkdir test

그리고 아래 명령을 실행해보세요. 

echo $?

명령의 그룹핑 {}

명령을 그룹핑 할 수도 있습니다. 아래 명령은

mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
  • mkdir test가
  • 성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다. 
  • 실패했을 때 echo 'There is no dir'를 실행합니다. 
  • 이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. 

 

리눅스 특수 문자
https://hack-cracker.tistory.com/26

 

 

 

문자열 제외 필터

grep -v '제외문자열'

 

 

#jq(JSON processor)를 이용해 json에서 원하는 값 찾기

# -o : output

$ kubectl get nodes -o json | jq -r '.items[].status.addresses[]|select(.type=="InternalIP").address'

 

*#jq 설치 *

$ brew install jq

 

# jsonpath에서 원하는 값 찾기

# JSONPath is a query language for JSON

# jsonpath 문법 설명 : https://github.com/json-path/JsonPath

$ kubectl get nodes -o jsonpath='{.items[].status.addresses[?(@.type=="InternalIP")].address}'

 

# 아래 구문의 결과는 모두 같음

$ kubectl get nodes -o jsonpath='{}'

$ kubectl get nodes -o jsonpath='{$}'

# 아래 구문의 결과는 모두 같음

$ kubectl get nodes -o jsonpath='{$.items}'

$ kubectl get nodes -o jsonpath='{$.items[*]}'

 

# 아래 구분은 첫번째 결과 1개만 나옴

$ kubectl get nodes -o jsonpath='{$.items[]}'

 

kubectl get pods --no-headers | awk '{print $1}'
nginx-replicaset-c5k6r
nginx-replicaset-sd6tp
nginx-replicaset-sjrkd

 

kubectl get pods --no-headers | awk '{print $1}'|tail -1
nginx-replicaset-sjrkd

 

#포드 1개(리스트 중에 마지막 1개) 삭제

kubectl delete pods $(kubectl get pods --no-headers | awk '{print $1}'|tail -1)

 

참고 : awk 소개

https://recipes4dev.tistory.com/171

 

 

cd \

sudo du -d 1 -h|grep ^[0-9.]*G

 

5.3G ./var

1.7G ./usr

1.1G ./home

 

#디스크 많이 쓰는 경로를 차례로 탐색 2G 이상 로그가 쌓인 아래 경로 확인

cd /var/log/journal/

 

#journal 로그가 많이 쌓임 확인

#관련 자료 검색 키워드 “linux journal 로그

https://sysops.tistory.com/115

 

sudo vi /etc/systemd/journald.conf

 

#아래 문서 참고로 로그 보관기간 최대용량 관련 설정

https://www.freedesktop.org/software/systemd/man/journald.conf.html

 

생략

SystemMaxFileSize=1G

생략

MaxFileSec=5day

 

 

 

#서비스 재시작

 sudo systemctl restart systemd-journald

sudo systemctl force-reload systemd-journald

 

#Journal 로그 용량 재확인

journalctl --disk-usage

 

 

#로그 로데이트 설치 여부 확인

rpm -qa|grep logrotate

 

 sudo vi /etc/logrotate.conf

#weekly daily 변경

daily

 

#compress 옵션

compress 

 

 

 

##Journal 로그가 아닌 경우 

 

 

1. 디스크 많이 쓰는 경로를 차례로 탐색 

cd \
sudo du -d 1 -h|grep ^[0-9.]*G

 

cd var

sudo du -d 1 -h|grep ^[0-9.]*G

 

cd lib

sudo du -d 1 -h|grep ^[0-9.]*G

실제 원인 폴더, 파일 확인까지 상세 폴더 내려가면서 반복


#예)

/var/lib/jenkins/workspace/  하위의 *.hprof (JAVA 힙메모리 로그)에서 최근 로그가 많이 쌓인 것 확인

 

5일 경과 로그 삭제 

find /var/lib/jenkins/workspace/ -name *.hprof -ctime +5 -exec rm -rf {} \;

 

#삭제 후 Disk 사용률 비교

 

클론탭에 로그를 주기적으로 삭제하도록 등록

crontab -e

 

#매일 오후 4 48분에 젠킨스 workspace 5일 결과한 heap로그 파일 삭제

48 16 * * * find /var/lib/jenkins/workspace/ -name *.hprof -ctime +5 -exec rm -rf {} \;

 

 

#물론 java 힙 메모리 로그가 필요 없으면 실행 옵션에서 heap메모리로그 옵션을 끄는 것이 더 좋은 방법입니다.

https://www.cyberciti.biz/faq/star-stop-restart-apache2-webserver/

 

Start / Stop and Restart Apache 2 Web Server Command - nixCraft

Explains how to start Apache 2 / stop Apache 2 / restart Apache 2 web server under Linux operating systems.

www.cyberciti.biz

 

How do I restart an Apache 2 Web Server under a Debian / Ubuntu / CentOS / RHEL / Fedora Linux or UNIX-like operating systems? Can you tell me command to start or stop Apache 2 web server running on Linux?

[donotprint][/donotprint] Apache is primarily used to serve both static content and dynamic Web pages on the World Wide Web. Many web applications are designed expecting the environment and features that Apache provides. Apache can be started or restarted using any one of the following methods on Linux or Unix-like systems.


First, login to your web-server using ssh client, if server is not in your local data center:
ssh root@your.server.com
Once logged in type the following commands as per your Linux or Unix variant.

Debian/Ubuntu Linux Specific Commands to Start/Stop/Restart Apache

You can either use service or /etc/init.d/ command as follows on Debian Linux version 7.x or Ubuntu Linux version Ubuntu 14.10 or older:

Restart Apache 2 web server, enter:

# /etc/init.d/apache2 restart
OR
$ sudo /etc/init.d/apache2 restart
OR
$ sudo service apache2 restart

To stop Apache 2 web server, enter:

# /etc/init.d/apache2 stop
OR
$ sudo /etc/init.d/apache2 stop
OR
$ sudo service apache2 stop

To start Apache 2 web server, enter:

# /etc/init.d/apache2 start
OR
$ sudo /etc/init.d/apache2 start
OR
$ sudo service apache2 start

A note about Debian/Ubuntu Linux systemd users

Use the following systemctl command on Debian Linux version 8.x+ or Ubuntu Linux version Ubuntu 15.04+ or above:
## Start command ##
systemctl start apache2.service
## Stop command ##
systemctl stop apache2.service
## Restart command ##
systemctl restart apache2.service

CentOS/RHEL (Red Hat) Linux version 4.x/5.x/6.x or older specific commands

## Start ##
service httpd start
## Stop ##
service httpd stop
## Restart ##
service httpd restart

CentOS/RHEL (Red Hat) Linux version 7.x or newer specific commands

Most modern distro now using systemd, so you need to use the following command:
## Start command ##
systemctl start httpd.service
## Stop command ##
systemctl stop httpd.service
## Restart command ##
systemctl restart httpd.service

Generic method to start/stop/restart Apache on a Linux/Unix

The syntax is as follows (must be run as root user):
## stop it ##
apachectl -k stop
## restart it ##
apachectl -k restart
## graceful restart it ##
apachectl -k graceful
## Start it ##
apachectl -f /path/to/your/httpd.conf
apachectl -f /usr/local/apache2/conf/httpd.conf

#매일 오후 4시 48분에 /log/app의  5일 경과한 로그 삭제
48 16 * * * find /log/app -ctime +5 -exec rm -rf {} \;

 

crond은 정해놓은 주기 시간마다 반복적으로  프로그램을 수행하도록 하는 데몬입니다.

 

특정시간 파일을 지우는프로그램을 crond 에 등록 하기

 

 

 

crond은 crontab 라는 것으로 작업목록이 등록 됩니다.

   순서 : 1. 파일을 지우는 명령을 작성한다.

             2. crontab에 등록한다.

             3. crond 데몬을 재구동 한다. : 구동이 안된경우도 있으므로

  

 1. crontab 등록  방법

   # crontab 형식

  #  Min(0-59) Hour(0-23) Day(1-31) Mon(1-12) Week(0-6)   command

 

    5분 마다 command가 수행되도록 하는 방법을 예로 들어보면 
   1)   */5   *   *    *    *      command   

   2)   0,5,10,15,20,30,35,40,45,50,55  *   *  *  * command

   3) Week 0 또는 7이 일요일 1부터 월요일

 

   설명 :  

       command 앞에는 5가지 필드가  주기를 나타냅니다. ( 필드마다 스페이스로 구분)

       순서대로  분 시 일 월 주 를 가리킵니다. 

       그리고 각 주기는 아래와 같이 숫자로 또는 *  로 설정 합니다.

       * : 는 항상을 나타내고 숫자는 해당 위치에 따라 각 분 시 일 주 등을 나타냅니다.

       위의 내용은 매 */5 분 마다  매시간  매일 매월 매주 command를 수행하라입니다.      

 

2. 명령 작성

   crontab이 뭔지는 아셨지요 ?  (더자세한 것은  man 페이지를 참고 하시면 됩니다.)

    파일을 지워야 하니 command 대신 파일 지우는 command 또는 셀 스크립트를 작성 해야 합니다.

 

   error  파일은 그냥 두고 error.6405, error.16369 .. 들을 지우신다면

  

   파일의 내용을 지우거나 파일을 지우려면 아래 내용을 수정해서 쓰시면 됩니다.

 

   cat /home/work_bin/remove.sh

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

    #!/bin/bash

    # 파일을 삭제한다.  error.6405, error.16369 ..  

    find /home/work/    -name  error.*    -exec rm -rf {} \;

 

    #error 파일은  내용만 지운다  

    find /home/work/    -name  error    -exec cat /dev/null >  {} \;

    또는

    cat /dev/null  > error   

 

  [추가]

    특정한 파일이 특정 기간이 지난 것만 지우는 법

 

    find  [Dir]   -name error*  -ctime +n      : n day  이전에 생성된 파일

    find  [Dir]   -name error*  -mtime n       : n day  1일간 에 수정된 파일만

 

    find  [Dir]   -name error*  -ctime +30    : 30일 이전 파일들을 모두 찾는다.

 

     -  ctime  : 파일이 생성된 시간을 가진다.

     -  mtime 은 마지막 수정한 시간이다. 따라서 함부로 파일을 열고 닫으면서

     -  atime 은 마지막으로 access 된 시간이다 ( vi, cat ) 등으로  파일을 읽으면 변경됨.

      -  +n    : n days ago

      -   n    : n days ago

 

 

 3. 셀 스크립트를 테스트 해보셔야 합니다.

   파일 권한이 없어서 파일이 지워 지지 않는다면 root 계정에 cron 작업을 등록 해야 합니다.

  

 4. crontab -e 명령으로 

    아래중 원하는 내용을 등록 하시면 됩니다.

 

# 매 5 분마다

*/5   *   *    *    *    sh  /home/work_bin/remove.sh > /dev/null

 

# 매일 1시 마다 수행

0   1   *    *    *     sh  /home/work_bin/remove.sh > /dev/null

 

# 매일 오후 1시~4시  수행

0   13,14,15,16   *    *    *      sh /home/work_bin/remove.sh > /dev/null

 

 

5. crond  구동

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

 참고로 위사항은 의 crond 가 구동이 되어 있어야 수행합니다.

 

[root@dev5 ODBS22]# chkconfig --list crond
crond           0:해제  1:해제  2:활성  3:활성  4:활성  5:활성  6:해제

 

서비스가 구동 되도록 등록 되어 있는지 확인 하시고

(현재 런레벨 3 5 중에 해제 혹은 off 이면  구동이 안되고 있겠지요)

 

[root@dev5 ODBS22]# chkconfig --level 345  crond  on

[root@dev5 ODBS22]# /etc/rc.d/init.d/crond restart

 

하셔야 재부팅시도 crond가 계속 작동 됩니다.

 

                                           good Luck..!

결과에서 2번째 줄의 첫번째 단어 뽑아내기

 

kubectl get pod -l app=pingpong|grep pingpong|head -2|tail -1|gawk '{print $1}'

 

실제 사용 예)

POD_NAME=$(kubectl get pod -l app=pingpong|grep pingpong|head -1|gawk '{print $1}')

echo "Pod name is $POD_NAME"
echo "kubectl logs $POD_NAME"
kubectl logs $POD_NAME

 

 

#파라미터 존재 여부 확인

if [ -z "$1" ]

then

  echo "Mandatory Parameter \$1 : pod name"

  exit

fi

 

 

#명령어 존재 여부 확인

if ! hash -- gawk 2> /dev/null; then

  echo "Command not found gawk \n"

  echo "You can install the gawk with as below script :"

  echo "brew update"

  echo "brew install gawk"

  exit

fi

 

 

서버 운영하다보면 디스크 용량이 가득차는 경우가 있는데 어느 디렉토리에서 용량을 많이 사용하고 있는지 궁금할 때가 있다. 이 때 각 디렉토리별 용량을 확인하기 위해 필요한 명령어다.

du -h --max-depth=1

 

du -sh *

현재 폴더의 하위 1depth만 간단하게 볼 때

## word jumps 활성화 하기 - 기본적으로 oh-my-zsh에서는 `option + 방향키` 조합의 단어별 이동이 불가능하다.

이를 수정하려면 별도의 설정수정이 필요하다.

 

- iTerm -> Preferences -> Profiles -> Keys 로 이동한다.

 

- `+` 버튼을 누르고 위에서 부터 차례대로 아래 설정을 추가한다.

Option + right ⌥→

Send Escape Sequence

f

 

- `+` 버튼을 누르고 아래 설정을 추가한다.

# Option + left ⌥←

Send Escape Sequence

b

+ Recent posts