회사에서 크론탭을 이용하여, 쉘 스크립트를 지정된 시간에 실행할 수 있도록 진행하였다. 

많은 글들을 보았고, 내게 필요했던 정보들을 기록하려한다.

 

크론탭(Crongtab)

매일 혹은 주기적으로 해야하는 작업을  실행 시키기 위해 사용한다. 

나 같은 경우는 실행 중인 프로세스를 체크하는 스크립트를 매일 7시에 실행, 

일정 기간이 지난 로그들을 삭제하는 스크립트를 매일 11시에 실행 등의 작업을 주기적으로 하기 위해 사용하였다.

 

- 기본 사용 방법

crontab -l 		# 저장된 작업 리스트 출력
crontab -e 		# 크론탭 작업 수정 
crontab -r 		# 저장된 작업 삭제
crontab -u [사용자명] [파일] 		# 해당 사용자에게 파일에 적힌 크론탭 내용 등록

# 은 주석

- 규칙

# /etc/crontab
# 분(0-59) / 시(0-23) / 일(1-31) / 월(1-12) / 요일 (0-6 : 0은 일요일 ~ 6은 토요일) [유저이름] [명령어]

     *          *           *            *         *      유저이름    명령어

# crontab -e
# 분(0-59) / 시(0-23) / 일(1-31) / 월(1-12) / 요일 (0-6 : 0은 일요일 ~ 6은 토요일) [명령어]
  
     *           *          *            *          *      명령어

 

/etc/crontab의 경우 어떤 사용자의 크론탭에서 사용할건지 사용자명을 지정해줘야한다.  - root 권한이 있는 경우

crontab -e 의 경우 해당 사용자의 크론탭을 편집할 수 있다. - root 권한이 없는 경우

 

etc/crontab

root 권한이 있을 경우, etc/crontab 파일을 편집하여 작업할 수 있다.

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

 앞에 다섯개의 별이 실행 시간에 대해 규칙을 정하는 부분이고, 사용자를 적는 부분, 실행할 명령어를 적는 부분으로 되어있다.

crontab -e

root 권한이 없는 경우, crontab -e 명령어를 통해 크론탭을 편집한다.

# delete log 
# 매일 11시 30분에 해당 sh을 실행
30 11 * * * /tmp/test/deltelog.sh > /dev/null 2>&1

# 매일 07시에 해당 sh을 실행
# restart process
0 7 * * * * /tmp/test/service.sh start > /dev/null 2>&1

 

service crond restart

크론탭을 수정하고 난 뒤에는 꼭 restart 해줘야 적용된다.

cat /var/log/cron

크론탭의 수행 이력과 변경 내용에 대한 로그는 cat /var/log/cron 명령어를 통해 확인할 수 있다. ( root 권한으로! )

 

크론탭이 정상적으로 실행되지 않을 때

크론탭이 정상적으로 실행되지 않을 때는 로그 파일을 생성해서 확인해보자

test.sh >> /tmp/testCron.log 2>&1
  • `test.sh` : 실행할 쉘 스크립트의 파일 이름
  • ` >> /tmp/testCron.log` : 쉘 스크립트의 실행 결과를 파일에 추가하는 리다이렉션
    `>>` 는 파일이 존재하면 뒤에 오는 파일에 결과를 추가하고, 파일이 없으면 새로 생성한다.
  • `2>&1` : 표준 에러를 표준 출력으로 리다이렉션 하는 부분. 
    즉, 에러메시지가 /tmp/testCron.log 파일에 기록된다.

 

크론탭 사용시 주의할점

규칙에 맞게 설정했는데도 제대로 동작하지 않는 경우가 있다. 대부분의 경우 환경변수와 절대경로가 말썽이다. 

!! 크론탭은 실행 시에 별도의 쉘을 띄운다. !!

1. 환경변수

- SHELL
작업을 실행시킬 쉘을 지정할 수 있다.  지정하지 않을 시 기본 값으로 /bin/sh 로 쉘을 시작한다.

-PATH
크론탭은 쉘을 새로 띄우기 때문에, 쉘에서 프로그램을 찾기위한 PATH를 지정해줄 필요가 있다. 
계정으로 로그인 해서 쉘을 실행시키는게 아니기 때문에, 계정에 있는 PATH 변수를 사용할 수가 없다.

- MAILTO
마일토? 메일토.. 메일 투! 크론이 수행한 결과를 메일로 보낼 수 있다. 기본 값으로는 작업을 실행한 주체에게 전송한다.

- HOME
크론탭의 home 디렉토리 경로를 설정한다. 기본적으로 크론탭을 실행한 유저의 홈디렉토리로 /etc/passwd에 설정된 경로를 따른다.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

 

2. 절대경로 / 상대경로

크론탭은 실행시에 별도의 쉘을 띄운다. 상대경로로 명령어를 사용하면 Crong은 알 수가 없다..
항상 절대경로로 명령어를 사용해야한다

 

kill

리눅스 환경에서 프로세스를 종료하기 위해서는 kill 명령어를 사용한다.

종료할 프로세스를 찾기 위해 ps -ef 명령어를 통해서 PID를 먼저 찾아야한다.

ps -ef | grep 프로세스명

UID, PID, PPID 순으로 나온다.

 

Kill 명령어로 프로세스를 종료 시키는 옵션에는 -9 와 -15가 있다.

 

kill -9 <PID>

리눅스 커널이 프로세스를 강제로 종료한다. 프로세스가 자원을 제대로 해제하지 않을 때 사용한다.

프로세스를 강제로 종료하기 때문에 저장되지 않은 데이터가 날아가는 경우가 발생한다.

 

kill -15 <PID>

일반적인 종료 방법으로 프로세스가 정리 작업을 수행할 기회를 준다.

메모리상에 있는 데이터와 각종 설정/환경 파일을 안전하게 저장한 후 프로세스를 종료한다.

 

예시.

# PID가 1234인 프로세스를 강제로 종료한다
kill -9 1234

# PID가 5678인 프로세스를 종료한다.
kill -15 5678

 

 

Repository 란

Repository란 소프트웨어 패키지와 메타 데이터가 저장되는 패키지 저장소이다.

대부분의 리눅스 배포판은 자체 공식 저장소를 가지고 있다. 공식 저장소에는 시스템 운영에 필요한 핵심 패키지들과 검증된 소프트웨어 패키지들이 제공된다.

하지만 때로는 추가적인 패키지가 필요할 때가 있는데, 그럴 때는 개발자나 사용자 그룹들이 유지보수 하고 제공하는 커뮤니티 저장소를 추가하여 이용한다. 
예를 들어, EPEL 저장소는 CentOS과 RHEL과 호환되면서 더 많은 소프트웨어 패키지를 제공한다.

  • 공식 저장소 
    : 대부분의 리눅스 배포판은 자체 공식 저장소를 가지고 있다. 해당 배포판을 위해 검증된 소프트웨어 패키지가 포함되어있다. 시스템에 필요한 핵심 소프트웨어부터 다양한 응용프로그램까지 다양한 패키지가 제공된다.
  • 커뮤니티 저장소
    : 개발자나 사용자 그룹들이 유지보수하고 제공하는 저장소이다. 공식 저장소에는 포함되지 않은 소프트웨어,최신 버전의 응용프로그램, 실험적인 소프트웨어 등이 포함된다. 

 

시스템 리포지토리 정보가 들어있는 파일은 /etc/yum.reps.d 디렉토리에 있으며 repo 확장자를 가지고 있다.

yum 과 dnf 등의 패키지 관리 도구는 이 디렉토리의 설정 파일을 참조해서 동작한다.

 

yum 과 dnf

리눅스에서 패키지를 관리하고 설치하는 것은 주로 'yum'과 'dnf' 라는 패키지 관리자를 통해 이뤄진다.

이 둘은 리눅스 배포판에서 패키지를 다운로드하고 설치하는 도구인데, 'dnf'는 CentOS 8, Fedora 22 부터 사용할 수 있고 'yum'은 그 이전 버전의 시스템에서 아직 사용되고 있지만 기본적으로 'dnf'를 사용하도록 권장되고 잇다.

 

yum 기본 명령어 사용법

#패키지 설치
yum install <패키지 이름>

#설치된 패키지를 최신버전으로 업데이트
yum update <패키지 이름>

#시스템에 설치된 모든 패키지를 최신버전으로 업데이트
yum update 

#특정 패키지 정보 조회
yum info <패키지 이름>

#패키지 삭제
yum remove <패키지 이름>

#패키지 검색
yum search <키워드>

yum list | grep <키워드>

#캐시 정리
yum clean packages

 

dnf 기본 명령어 사용법

#패키지 설치
dnf install <패키지 이름>

#특정 패키지 최신 버전으로 업데이트
dnf update <패키지 이름>

#모든 패키지 업데이트
dnf update

#특정 패키지 정보 조회
dnf info <패키지 이름>

#패키지 삭제
dnf remove <패키지 이름>

#패키지 검색
dnf search <키워드>

#이미 다운로드 된 패키지 조회
dnf list installed | grep <패키지 키워드>

#의존성 확인
dnf deplist <패키지 이름>

#특정 패키지 그룹 한번에 설치 
dnf grouplist <패키지 이름>

#캐시 정리 
dnf clean packages

 

 

/etc/*relese

 

cat /etc/*release

 

/etc/*relese 파일은 리눅스 시스템에서 사용되는 여러 리눅스 배포판의 정보를 포함하고 있는 파일들의 집합이다.

주로 사용되는 파일들 중 하나는 '/etc/os-release' 로 리눅스 OS의 세부적인 정보를 포함하고 있다.

  • NAME: 리눅스 배포판의 이름
  • VERSION: 리눅스 배포판의 버전
  • ID: 리눅스 배포판의 고유 식별자
  • VERSION_ID: 리눅스 배포판의 세부 버전 ID
  • PRETTY_NAME: 보기 좋은 형태의 리눅스 배포판 이름과 버전

 

*relese

 

간단하게 OS의 버전만 보고싶다면,

cat /etc/issue*

 

-P 옵션으로 포트번호를 지정하지 않으면 기본 포트번호인 22번 포트를 이용한다.

SCP

Secure Copy Protocol 을 사용하여 파일 또는 디렉토리를 안전하게 다른 시스템으로 복사하는 명령어이다.

기본적으로 SSH 프로토콜을 사용하여 데이터를 전송하므로 데이터가 암호화 된다.

 

scp [옵션] [원본] [대상]

 

  • 옵션
    • -r: 디렉토리와 그 내용을 재귀적으로 복사한다. 하위 디렉토리들 까지 모두 복사.
    • -P: 포트를 지정한다.
    • -i: 신원 확인을 위한 특정 개인키 파일을 지정한다.
  • 원본 : 복사하고자 하는 파일이나 디렉토리의 경로. 원격 시스템의 경우, 원본 경로에 사용자 및 호스트 정보를 포함할 수 있다.
    예를 들어, user@remote_host:/path/to/source 와 같이 작성할 수 있다
  • 대상: 파일 또는 디렉토리를 복사하고자 하는 위치. 원격 시스템의 경우, 대상 경로에 사용자 및 호스트 정보를 포함할 수 있다. 
    예를 들어, user@remote_host:/path/to/destination 과 같이 작성할 수 있다.

  •  Local -> remote , remote -> Local 모두 명령어는 Local 에서 입력한다.
scp file.txt user@remote_host:/home/user

 

Local -> remote 

 

현재경로의 파일을 원격지 서버의 경로로 전송한다.

-P 옵션으로 포트번호를 지정하지 않으면 기본 포트번호인 22번 포트를 이용한다.

# 단일 파일 전송

scp [옵션] [파일명] [원격지계정]@[원격지 IP]:[파일이 복사될 경로]

ex) scp -P 8111 test.txt burningman@192.168.1.1:/home/burningman

#복수 파일 전송

scp [옵션] "[파일명1] [파일명2] [파일명3]" [원격지계정]@[원격지 IP]:[파일이 복사될 경로]

ex) scp "text1 test2 test3" burningman@192.168.1.1:/home/burningman

 

Remote -> Local

원격지 서버의 파일을 로컬 서버의 경로로 가져온다.

-P 옵션으로 포트번호를 지정하지 않으면 기본 포트번호인 22번 포트를 이용한다.

# 단일 파일 가져오기
scp [옵션] [원격지 계정]@[원격지 IP]:[파일명] [로컬에 저장될 경로]

ex) scp burningman@192.168.1.1:/home/burningman/test /home/testuser/

# 복수 파일 가져오기
scp [옵션] [원격지 계정]@[원격지 IP]:"[파일명1] [파일명2] [파일명3] [로컬에 저장될 경로]

ex) scp burningman@192.168.1.1:"/home/burningman/test1 /home/burningman/test2 /home/burningman/test3" /home/testuser/

 

디렉토리 전송

디렉터리를 복사하고 싶다면 -r 옵션을 활용하여, 

# hostIP 주소
scp -r /home/user/pakage 192.168.1.1:/home/pakage

# hostname@hostIP 
scp -r /home/user/pakage burningman@192.168.1.1:/home/pakage

 

리눅스의 계정 정보는 /etc/passwd 에 있다.

디렉토리 구조에 대해 잘 모른다면 하단의 글을 확인하자.

2023.11.30 - [리눅스] - 리눅스 디렉토리 구조_간단하게 정리 : /home, /etc, /var, /usr ...

 

전체 사용자 목록 확인

cat /etc/passwd

 

 

아이디만 확인하고 싶을 때

cut -f1 -d: /etc/passwd

 

 

 

리눅스 디렉토리 파일 구조

리눅스 디렉토리 파일 구조는 계층적이며 특정한 목적을 가진 디렉토리들의 집합이다.

각 디렉토리는 파일 및 다른 디렉토리를 포함할 수 있고, 시스템에서 필요한 정보와 프로그램들이 존재한다.

 

리눅스 디렉토리 파일 구조

 

 

리눅스 디렉토리 파일 구조

 

 

  • / (루트 디렉터리)
    - 리눅스 파일 최상위 디렉토리이다.
    - 모든 다른 디렉토리와 파일의 시작점.
  • /bin (바이너리)
    - 기본적인 명령어를 담고 있는 디렉토리이다. ( cd, mv, cp, ... )
    - 리눅스 시스템을 운영하기 위한 기본 명령어들이 여기 위치한다.

  • /etc (설정)
    - 시스템의 전반적인 환경 설정 파일들이 위치한다.
    - 네트워크 설정 파일, 소프트웨어 설정 파일, 사용자 계정 파일, 파일 시스템 정보 등의 파일이 포함된다.
    - 따라서, 시스템에 어떤 문제가 발생하거나, 시스템 전체 환경을 바꾸기 위해서는 /etc 디렉토리 내에 포함된 파일들에 대해 알아야한다.
    • /etc/sysconfig/network : 리눅스 서버의 hostname 변경, 네트워크 활성화를 위한 설정파일 .
    • /etc/resolv.conf : 시스템의 DNS 설정을 포함. DNS 서버 주소 및 도메인 검색에 관련된 정보.
    • /etc/hosts: 호스트명과 IP 주소간의 매핑 정보를 제공.
    • /etc/group: 그룹에 대한 정보를 포함하고 있는 파일.
    • /etc/passwd: 사용자 계정에 대한 정보를 저장. 각 사용자의 계정 이름, 사용자 ID, 홈 디렉토리 경로 등의 정보가 기록되어 있다.
    • /etc/ssh/sshd_config : SSH 서버의 설정파일, SSH 접속 관련 설정을 수정할 수 있다.
  • /home (홈)
    - 사용자의 홈 디렉토리(사용자 계정명과 동일)가 만들어지는 디렉토리.
    - 사용자는 /home 안에 자신의 디렉토리를 갖는다.

  • /lib (라이브러리)
    - 시스템에 필요한 라이브러리 파일들이 위치한다.
    - 실행 파일들이 필요로하는 라이브러리는 여기에 설치된다.
    - 시스템 부팅과 /bin과 /sbin 디렉토리에 있는 바이너리 파일들을 실행해주는 공유 라이브러리를 보유하고 있다.

  • /usr (유저)
    - 사용자가 설치한 프로그램이나 데이터들을 포함하는 디렉토리이다.
    - 대부분의 소프트웨어들은 여기에 설치된다.
    - 하위에는 /bin, /sbin, /local 등이 있다. 

  • /var (변수)
    - 로깅, 사용자 추적, 캐시 등의 시스템 운영 중에 발생한 가변 데이터가 저장되는 디렉토리이다.
    • /var/log : 다양한 프로그램들의 로그 파일.
    • /var/local : /usr/local 아래에 설치된 프로그램들의 데이터 보관.
    • /var/log/wtmp : 시스템의 모든 로그린,로그아웃 정보 기록.
    • /var/tmp : /tmp에 있는 임시파일들 보다는 좀 더 오래 유지될 필요가 있는 임시 파일들, 부팅 시 지워지지 않는다.
  • /tmp (임시)
    - 임시 파일들이 저장되는 디렉토리이다.
    - 시스템이 다시 시작되면 /tmp 디렉토리의 포함 항목이 삭제된다.
 

 

- Linux Shell

GUI 환경에서는 화면이 보이고 마우스로 어플리케이션을 더블클릭하여 실행하지만, 

CLI 환경에서는 명령 프롬프트 창을 띄워서 직접 명령어를 쳐서 어플리케이션을 실행한다.

 

OS가 사용자와 상호작용 하기 위해서. OS와 사용자 사이에 하나의 껍데기 층을 만들게 되는데 그게 쉘(Shell)이다.

OS는 쉘(Shell)을 통해서 사용자에게 어떤 어플리케이션을 실행할건지 입력 받게 된다.

 

 

 

 

-> 쉘(Shell)은 컴퓨터 운영체제에서 사용자와 컴퓨터 하드웨어 또는 커널 사이를 연결하는 인터페이스이다.

주로 CLI(Command Line Interface)로 작동하여 사용자가 컴퓨터 자원을 관리하고 프로그램을 실행하는 등

컴퓨터 시스템과 상호 작용할 수 있도록 돕는다.

 

- 쉘은 여러 종류가 있으며, 가장 흔한 쉘로는  Bash, Zsh, C Shell, tcsh 등이 있다.

- 명령어 실행, 파일 및 디렉토리 관리, 프로세스 제어, 환경 변수 설정 등 다양한 기능을 제공한다.

- 또한, 쉘 스크립트를 작성하여 자동화된 작업을 수행하거나 여러 명령어를 일괄 처리 할 수도 있다.

 

 

 

+ Recent posts