본문 바로가기
정보보안/이론

[KITRI] Day8. 리눅스 기본 명령어-6

by 민-Zero 2020. 4. 29.

직접 crontab -e를 이용하여 실행하고자 하는 것을 등록해도 되지만 다른 방법도 존재한다.

cron과 관련된 데몬의 설정을 확인해보면 매시간 1분에 cron.hourly라는 디렉토리에 있는 모든 파일을 실행하도록 하고 daily, weekly, monthly 등도 유사하게 작성되어 있다. 즉, 직접 스케줄에 등록하는 것뿐만 아니라 실행하고자 하는 파일이 존재한다면 cron.hourly, daily 등의 디렉토리에 실행파일을 저장해도 된다.


이를 확인하기 위해 간단하게 위와 같은 쉘코드를 작성한 backup-day.sh 파일을 생성하고 해당 디렉터리에 넣어 확인하자.

daily디렉터리에 넣은 쉘 코드가 자동으로 실행되어 코드 내용대로 txt 파일이 생성되는 것을 확인할 수 있다. 이때 파일이 생성되지 않는다면 데몬에 아직 적용되지 않은 것이므로 service crond restart를 통해 데몬을 재시작해주면 된다.

 

해당 명령어가 아무 사용자나 사용할 수 있어서 작업 스케쥴에 실행파일을 등록하면 백도어가 등록되는 등 부적절한 방법으로 이용될 수 있다. 이를 방지하기 위해 해당 명령을 사용할 수 있는 계정을 등록하도록 지원한다. at.deny, cron.deny에 아이디를 등록하면 해당 명령어를 등록된 유저는 사용할 수 없다.

at.deny 또는 cron.deny에 간단하게 계정명만 추가하면 된다.

그럼 해당 사용자는 deny에 등록된 명령어를 사용할 수 없게된다.

 


이때 at.allow, cron.allow는 존재하지 않는데 해당 파일들을 생성하고 아이디를 등록하면 allow파일이 없을 때 잘 동작하던 아이디도 allow에 등록되지 않았다고 명령어의 사용이 되지 않는다. 또한 allow, deny에 user1이라는 아이디를 등록하면 정책상 거부와 허용이 둘 다 적용되는 충돌이 발생한다. 이때 우선순위를 가지는 것은 allow 이므로 user1은 명령어에 권한을 가지게 명령을 되어 사용할 수 있다.

 


프로세스


하드디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화된 상태를 뜻한다.

포그라운드 프로세스 : 실행하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스를 말한다. 키보드의 입력을 받아주는 프로세스
백그라운드 프로세스 : 화면에는 나타나지 않고 뒤에서 실행되는 프로세스를 말한다. 예를 들어 백신, 서버 데몬 등 눈에 보이지 않지만 실행되는 것이다.

프로세스 번호(PID) : 메모리에 로딩되어 활성화된 프로세스를 구분하기 위한 고유의 고유 번호이다. 동일 프로그램이 여러 개 동작할 때 구분하기 위해 사용되기도 하고 메모리에서 활성화된 프로세스를 메모리에서 강제로 제거하려면 프로세스 번호를 사용해야 하기 때문에 사용한다.

 

ping 168.126.63.1 > result.txt & 이런 식으로 명령어 뒤에 &기호를 붙이면 백그라운드에서 동작하게 하여 해당 명령이 수행되는 동안 다른 작업을 수행할 수 있게 해 준다.


백그라운드 동작 프로세스 종료 방법

 

포그라운드로 프로세스 가져오기

프로세스 하나를 백그라운드에서 동작시킨 후 jobs 명령어를 통해 확인하면 동작중인 것을 확인할 수 있다. 이때 종료하고자 하는 프로세스를 포그라운드로 가져온다. 윈도우에서 최소화를 통해 안보이게 해놓은 프로세스를 다시 꺼내는것이라고 생각하면 된다. 가져온 프로세스는 ctrl+c 단축키와 같이 원래 사용하던 종료 방법을 수행하면 종료된다.


jobs : 명령어를 통해 동작중인 작업 확인, 윈도우 작업 표시줄과 같은 역할, BackGround에 넘어간 순서대로 순차적으로 부여됨, 가장 최근에  BackGround에 넘어간 작업에 + 기호가 부여된다.
fg %작업번호 : 작업번호에 해당하는 작업을 포그라운드로 끌어내기
ctrl+c : 프로세스 종료 단축키

ctrl+z : 프로세스 정지(stop) 단축키
bg %작업번호 : Stop 상태로 background에 넘어간 작업을 running 상태로 전환


kill 명령어를 통해 종료

 

kill 명령어를 통해 프로세스를 종료하기 위해서는 PID를 알아야 한다. PID를 확인하기 위한 명령어로 ps가 존재한다. 다양한 옵션을 통해 현재 접속 중인 계정이나 다른 계정에서 사용 중인 프로세스 목록, 서버 전체의 프로세스 목록, 프로세스의 cpu, memory 사용량이나 부모 프로세스의 PID도 확인 가능하다.


ps : 현재 접속 중인 계정이 수행 중인 프로세스의 PID 확인
ps -a : 접속중인 계정에서 수행중인 모든 PID확인
ps -u 계정명 : 해당 계정이 사용 중인 PID 확인
ps -f : UID, PID, PPID 등 상세정보까지 확인
ps -e : 전체의 프로세스 목록 출력

ps u : 자원의 사용량까지 보여줌 
ps a : 터미널 관련 정보까지 전부
ps x : 모든 프로세스 목록 보여줌 
ps -ef , ps aux의 조합을 자주 사용함

 

ps 명령어를 통해 알아낸 PID를 kill 명령어를 사용하면 종료할 수 있다. kill 명령어는 기본적으로 -9 강제 종료 옵션을 가지고 있어 종료를 위해 -9를 꼭 입력하지 않아도 된다.

 

kill -l : kill 명령어 옵션 목록 확인 
kill -9 PID : 강제종료
kill -15 PID : 종료

 

kill 번호별 시그널 설명
SIGHUP, HUP : 프로세스 재구동 효과(캐시, 버퍼)
SIGINT, INT : CTRL + c 인터럽트
SIGQUIT, QUIT : ctrl + w 종료
SIGKILL, KILL : 죽임(kill)
SIGTERM, TERM : 정상종료(Terminate), 기본값
SIGHUD, CHILD : 자식 프로세스 정리(zombie)
SIGSTOP, STOP : 정지

 

ps 명령어와 grep이 합쳐진 명령어로 동작중인 프로세스명을 알고 있을 때 간단하게 PID만 확인하기 위해 사용한다.


pgrep 프로세스명 : ps와 grep이 합쳐진 명령어 원하는 프로세스명과 매칭 되는 프로세스의 PID가 출력된다
pgrep -x 프로세스명 : 정확하게 프로세스명이 일치하는 PID 출력
ps -p $(pgrep -x ping)  :     pgrep과 ps -p 조합
ps -p `pgrep 패턴(문자열)` : 해당 명령의 결과를 ps -p에 적용하여 수행

 

프로세스를 확인하는 다른 명령어

 

pstree 명령어

pstree 명령어는 동작중인 프로세스가 어떤 프로세스를 부모 프로세스로 가지고 있는지 확인하기 위해 사용한다. 이때 리눅스는 최상위 부모 프로세스인 init을 제외하면 모든 프로세스는 부모 프로세스를 가진다. 자식 프로세스가 종료를 원할 때 부모 프로세스에게 알리고 종료가 되고 부모 프로세스가 종료되면 자식 프로세스도 같이 종료가 되는데 각 경우에 오류가 발생하면 좀비 프로세스나 고아 프로세스가 생성되기도 한다.

 

고아 프로세스와 좀비 프로세스 정의를 간단히 정리하면 아래와 같다.

고아 프로세스 : 부모 프로세스가 자식 프로세스보다 먼저 종료되고 자식 프로세스는 남아있는 경우 자식 프로세스는 고아 프로세스가 된다.

좀비 프로세스자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 자식 프로세스를 좀비 프로세스라고 한다.

 

pstree : 부모 프로세스, 자식 프로세스의 관계를 확인할 수 있는 명령어
pstree -p : PID를 포함하여 보여준다.

 

top 명령어

프로세스의 cpu, 메모리 사용량 등과 같은 다양한 통계 확인 가능하기 때문에 리눅스 시스템의 운용상황을 실시간으로 전반적인 상황을 모니터링하거나 프로세스 관리할 때 사용하는 유틸리티이다. 

top 명령어를 실행했을 때 볼 수 있는 화면이다. 프로세스별 메모리 사용량이나 우선순위 등 다양한 정보를 확인할 수 있다.

 

top -d 1 : 프로세스의 사용량 확인 딜레이를 1초로 설정하여 1초마다 갱신

nice -숫자 프로세스 : 해당 명령을 통해 NI값을 직접 설정할 수 있다.

 

top 용어 정리

PID : 프로세스 ID (PID)

USER : 프로세스를 실행시킨 사용자 ID

PR : Pririoty 직접 조정은 불가능하다. 프로세스에 할당해주는 메모리의 우선순위, 해당 숫자가 낮을수록 많은 자원을 할당받아 빨리 동작한다. 
NI : nice, -20~19의 값이 설정된다. 해당 값을 이용하여 간접적으로 PR값을 조정한다. 기본값 0을 가지며 -20을 가지면 PR을 가장 작은 값 19를 주면 가장 큰 값을 준다 따라서 -20을 주면 많은 자원을 할당받을 수 있다.

VIRT : 가상 메모리의 사용량(SWAP+RES)

RES : 현재 페이지가 상주하고 있는 크기(Resident Size)

SHR : 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합.

S 필드는 상태 메시지 - S:sleeping T:stop D:inDlskwait(대기)  R:running  Z:zombie  
ps에서도 동일한 상태 메시지를 볼 수 있으며 +가 붙기도 하는데 이는 포그라운드에서 동작한다는 뜻이다. 소문자 s가 Ss 이런 식으로 붙기도 하는데 이는 세션 리더라고 한다. 제일 처음 실행된 프로세스이다.

% CPU : 프로세스가 사용하는 CPU의 사용률

% MEM : 프로세스가 사용하는 메모리의 사용률

COMMAND : 실행된 명령어

 

top 실행 중 단축키

shift + p CPU 사용률이 높은 프로세스 순서대로 표시
shift + m 메모리 사용률이 높은 프로세스 순서대로 표시
shift + t 프로세스가 돌아가고 있는 시간 순서대로 표시
k 프로세스  kill  - k 입력 후 종료할 PID 입력 signal을 입력하라고 하면 kill signal인 9를 입력
a 메모리 사용량에 따라 정렬
b Batch 모드 작동
c 명령행/프로그램 이름 토글
d  지연 시간 간격은 다음과 같다. -d ss. tt (seconds.tenths)
h 도움말 
H 스레드 토글
i 유휴 프로세스 토글
m VIRT/USED 토글
M 메모리 유닛 탐지
n 반복 횟수 제한 : -n number
p PID를 다음과 같이 모니터 : -pN1 -pN2 ... or -pN1, N2 [, ...] 
s 보안 모드 작동
S 누적 시간 모드 토글
u 사용자별 모니터링 : -u 사용자계정
U 사용자별 모니터링 : -U 사용자계정
v version 확인
스페이스바 refresh
숫자 1 CPU Core별로 사용량을 보여준다

 


데몬(서비스) 

 

centos ~6 : init + xinetd
centos 7~ : systemd

데몬(서비스) 실행 스크립트 위치
centos ~6 : /etc/init.d
centos 7~ : /usr/lib/systemd/system

데몬 구동/정지/상태
~6 : service 데몬명 start/stop/restart/status
7~ : systemctl start/stop/restart/status 데몬명
7~ : systemctl start/stop/restart/status 데몬명.service

데몬 자동 시작 등록/제거
~6 : chkconfig 데몬명 on/off
7~ : systemctl enable/disable 데몬명

데몬 자동 시작 여부 확인

부팅과 동시에 서비스의 자동 실행 여부를 지정은 ntsysv 또는 systemctl list-unit-files 명령을 실행하여 확인 가능하다. ntsysv가 깔려있지 않으면 yum list ntsysv로 패키지 설치 가능 한지 확인하고 다운로드하면 된다.

inetd(인터넷 데몬)에 보안을 강화하여 xinetd(eXtended 인터넷 데몬)이 되었으며, centos7 이후부터는 init데몬과 xinetd 데몬을 결합하여 systemd 데몬으로 변경되었다.
inetd, xinetd : 인터넷 데몬, 슈퍼 데몬으로 불린다.

 

데몬은 StandAlone형과 SuperDaemon형으로 나뉜다. 
StandAlone형은 독립적으로 동작하는 데몬들이며 SuperDaemon형은 스스로 동작하지 않고, SuperDaemon에 의해 동작하는 데몬이다. 간단히 정리하면 아래와 같다.
StandAlone형 데몬: 항상 프로세스 상태여야 하며, 서비스 요청 시 즉시 응답이 가능하다. 주로 자주 요청되는 서비스에 적용된다
SuperDaemon형 데몬 : 평소에는 프로그램(저장) 상태에서 서비스요쳥시 SuperDaemon에 의해서 동작(프로세스)을 시작하며, 서비스 종료와 함께 프로세스는 종료된다.

댓글