[Linux] 프로세스 관리

IkSun·2023년 4월 27일

리눅스실습

목록 보기
6/14
post-thumbnail

요약
00 개요
01 프로세스의 개념
02 프로세스 관리 명령
03 포그라운드ㆍ백그라운드 프로세스와 작업 제어
04 작업 예약
연습문제

프로세스의 개념

  • 프로세스
    • 현재 시스템에서 실행중인 프로그램
    • 리눅스는 다중 프로세스 시스템을 동시에 여러 프로세스 실행
  • 프로세스의 부모-자식 관계
    • 리눅스에서 모든 프로세스는 부모-자식 관계가 있음
    • 부모 프로세스가 자식 프로세스를 생성
  • 프로세스 번호
    • 각 프로세스는 고유한 번호를 가짐 : PID
    • 1번 프로세스는 systemd (/sbin/init), 2번 프로세스는 [kthreadd]
  • 프로세스의 종류
    • 데몬 프로세스
      • 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행
      • (예. 부팅을 할떄 자동으로 MariaDB 가 자동으로 실행이 되게 끔 설정할 수 있다)
    • 고아 프로세스
      • 자식 프로세스가 아직 실행중인데 부모 프로세스가 먼저 종료가 될떄 자식 프로세스는 고아 프로세스가 됨
      • (자식 프로세스는 최상단 1번 프로세스가 부모가 됨)
    • 좀비 프로세스
      • 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우의 자식 프로세스를 좀비 프로세스라 함.
      • 좀비 프로세스는 프로세스 목록에 defunct 프로세스라고 나오기도 함
      • 좀비 프로세스가 증가하면 프로세스 테이블의 용량이 부족해서 정상적인 프로세스가 실행되지 않을 수도 있음.

프로세스 관리 명령

1. ps

#--- <Unix Option> ---#
# 유닉스 옵션 : 묶어서 사용할 수 있고, - 으로 시작한다. 
ps				# 현재 터미널에서 실행중인 (현재 로그인된 사용자의) 모든 프로세스 정보 출력
ps -e			# 시스템 전체의 모든 프로세스 정보 출력 
ps -f			# 프로세스 상세 정보를 출력하기. <full format> (PPID, CPU 사용량, 시작시간 등)
ps -u tmskim	# 특정 사용자에 대한 모든 프로세스의 정보를 출력한다. <user format>
ps -p 1234		# pid로 지정한 특정 프로세스의 정보를 출력한다. 

#--- <BSD Option> ---#
# BSD 옵션 : 묶어서 사용할 수 있고, - 으로 시작하지 않는다.
ps a			# 백그라운드 프로세스를 포함한 터미널 세션에 연결되어 있는 모든 프로세스의 정보를 출력한다. <all process>
ps u 			# 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보 출력
ps x 			# 현재 터미널 세션에 연결되어있지 않은 프로세스까지 모든 프로세스의 정보 출력 <auxiliary>

#--- <GNU Option> ---#
# GNU 옵션 : -- 두 개로 시작한다. 
ps --pid PID 목록 # 목록으로 지정한 특정 PID 정보를 출력한다.

#--- <사용예> ---#
ps
ps -ef
ps aux

  • 현재 단말기의 프로세스 목록 출력하기 : ps

    • 현재 셸이나 터미널에서 실행한 사용자 프로세스의 정보를 출력
  • 프로세스 상세 정보 출력하기 : ps -f

    • PPID 와 C(CPU 사용량), 시작 시간 등의 정보가 추가로 출력

  • 터미널에서 실행시킨 프로세스 정보 출력하기 : ps a

  • 터미널에서 실행시킨 프로세스 상세 정보 출력하기 : ps au

    • 조금더 상세한 정보 출력(cpu 사용량, 메모리 사용량 포함해서 출력)
  • 전체 프로세스 목록 출력하기 (유닉스 옵션) : ps -ef | more

    • 그냥 ps 는 현재 터미널에서의 프로세스 정보를 출력하지만 e 옵션을 사용하면 전체 시스템에서 실행중인 모든 프로세스를 출력한다.
    • 전체 프로세스의 더 자세한 정보를 확인하기 위해 e, f 옵션을 함께 사용
  • 전체 프로세스 목록 출력하기 (BSD 옵션) : ps ax | more

    • 시스템에서 실행 중인 모든 프로세스를 출력
  • 전체 프로세스 목록 출력하기 (BSD 옵션) : ps aux | more

  • 특정 사용자의 프로세스 목록 출력하기 : ps -u user1

    • user1 이 실행한 프로세스 목록 출력
  • 특정 사용자의 프로세스의 더욱 상세한 정보를 목록으로보기 : ps -fu user1

  • 특정 프로세스 정보 출력하기 : ps -p 1584

    • p 옵션과 함께 특정 PID 를 지정하면 해당 프로세스의 정보를 출력
  • 특정 프로세스 정보 검색하기 : ps -ef | grep bash

    • ps -ef | grep 명령 의 형태로 연결해서 사용
    • 현재 리눅스에서 실행되고 있는 정보를 전부 화면에 뿌리고, 그것들 중 bash 라는 패턴이 포함된 라인 출력

2.  pgrep  [옵션]  [패턴]

pgrep # ps 와 grep 합친것
pgrep -x bash 					# 정확하게 bash 라고 하는것의 pid 출력
pgrep -l bash					# pid 와 명령 이름을 출력

#---<뒤에것 먼저 실행하고 그 결과를 앞의 명령어에 적용>---#
ps -fp $(grep -x bash)  		# pgrep 과 ps 명령을 연결하면 자세한 정보 검색 가능
ps -fp $(grep -u user1 bash)    # -u 옵션으로 사용자명을 지정하면 해당 사용자의 프로세스 정보만 검색


3.   프로세스 종료하기

  • 시그널
    • 프로세스에게 무언가 발생했음을 알리는 간단한 메시지
    • 무엇이 발생했는지를 나타내는, 미리 정의된 상수를 사용
    • 시그널은 번호로 구분되며(1번 부터 시작) 이름을 가지고 있다.
    • 시그널을 받은 프로세스는 기본적으로 종료(어떤 것은 종료되지 않은것도 있다).
kill [-시그널] PID		# 지정한 시그널을 프로세스에게 보낸다.

kill -l 				# 이 시스템에서 정의를 해놓은 64 개의 시그널 리스트를 보여줌
kill  1234				# PID 가 1234 인 프로세스에게 SIGTERM(15)을 보냄. 종료
kill -9 1234			# PID 가 1234 인 프로세스에게 SIGKILL(9)을 보냄. 종료
		
     -1		SIGHUP		# 터미널과 연결이 끊어졌을 떄 발생. 모든 child process 종료
     -2		SIGINT		# 인터럽트로 사용자가 ctrl + c 입력시 발생, 종료
	 -9		SIGKILL		# 이 시그널을 받은 프로세스는 무시할 수 없으며 강제 종료된다.
     -15	SIGTERM		# kill 명령이 보내는 기본 시그널, 소프트웨어 종료 시그널, 무시할 수 있음
     					# -> 프로세스와 관련된 팦일들을 정리하고 종료한다. 종료되지 않은 프로세스가 있을 수 있다.
                    
     -18	SIGCOUNT	# STOP 시그널 이후 계속 진행할 때 사용
     -19	SIGSTOP		# ctrl + z
     
#=== 프로세스 종료 예 ===#

#---[1번 터미널]---#
man ps 					# man 이라고 하는 프로세스 실행

#---[2번 터미널]---#
ps -fp $(pgrep -x man)  # man 이라는 프로세스의 pid 를 가지고 ps -fp 에 의해서 상세정보를 출력
kil 2290 				# pid 로 SIGTERM 이라는 시그널을 보내 프로세스 종료


pkill [-시그널] PID       # PID 가 아니라 프로세스의 명령 이름으로 프로세스를 찾아 종료

pkill man 				# man 이라는 이름의 프로세스를 찾아 종료
pkill -9 sleep			# sleep 이름을 가진 모든 프로세스를 찾아 9를 보냄
				
killall sleep 			# 해당 이름으로 실행중인 모든 프로세스를 한 번에 종료

top 					# 현재 실행중인 프로세스에 대한 정보를 주기적으로 보여주고, 
						# vi 처럼 내가 종료하기 전까지 계속 실행 -> 5초 마다 업데이트
						# 이런 명령어가 있다 정도

포그라운드 백그라운드 프로세스와 작업 제어

  • 작업 제어
    • 한 터미널에서 동시에 여러 프로세스를 실행하고 관리
    • 작업 제어 도구가 관리하는 프로세스를 작업이라고 함
  • 포그라운드 작업
    • 사용자가 입력한 명령이 실행되어 결과가 출력될 떄까지 기다리는 방식으로 처리되는 프로세스를 포그라운드 프로세스
  • 백그라운드 작업
    • 백 그라운드 방식으로 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있음
    • 한 터미널에서 여러 개의 프로세스를 동시에 실행 가능
    • 명령을 백그라운드로 실행하려면 명령의 마지막에 & 기호를 추가
# 포그라운드 -> sleep 명령이 끝날떄까지 기다려야한다
sleep 100 					

# 백그라운드 -> 프롬프트가 바로 나와 다른 명령을 실행시킬 수 있다.
sleep 100 & 

jobs				# [현재 계정 + 현재 터미널]의 백그라운드 프로세스 출력
jobs %1 			# 백그라운드로 실행중인 작업번호 1번 프로세스 출력
jobs $+ 또는 %% 		# 작업 순서가 + 인 작업 정보를 출력 (+ : 가장 최근에 접근한 작업)
jobs %- 			# 작업 순서가 - 인 작업 정보를 출력 (- : + 작업 바로 전 접근한 작업, 공백 : 그 외의 작업)

  • 작업 전환 및 종료
# 작업 전환하기
ctel + z 			# 포그라운드로 실행중인 프로세스 stop

fg					# 백그라운드 프로세스 중 작업 순서가 + 인 프로세스를 포그라운드로 전환
fg %2 				# 작업번호가 2번인 프로세스를 포그라운드 작업으로 전환

bg					# 포그라운드 프로세스 중 작업 순서가 + 인 프로세스를 백그라운드로 전환
bg %1 				# 작업 번호가 3번인 프로세스를 백그라운드 프로세스로 전환

sleep 100 		# 포그라운드로 실행 -> 1번
ctrl + z 		# STOP
bg %1 			# 백그라운드로 전환 -> 재실행 
fg 				# 바로 직전에 접근한 프로세스를 포그라운드로 전환

# 작업 종료하기
sleep 100
ctrl + c 				# 포그라운드 작업은 ctrl+c 를 입력하면 대부분 종료하거나, PID 를 검색해서 kill 명령어로 강제종료

sleep 100 & 		 	
kill %1					# 백그라운드 작업은 kill %1 명령으로 강제종료

  • 로그아웃 후에도 백그라운드 작업 계속 실행하기
    • 백그라운드 작업을 실행한 터미널이 종료되거나 사용자가 로그아웃하면 실행중이던 백그라운드 작업도 함께 종료
    • 로그아웃한 다음에도 작업이 완료될 때까지 백그라운드 작업을 실행해야 할 경우에 nohup 명령을 사용
nohup 명령& 
# 즉 위 명령어는 내가 터미널을 종료했음에도 불구하고 백그라운드 프로세스가 종료도지 않고 계속 실행되도록 해주는 명령어

nohup find / -name passwd & 
# 터미널이 종료가 되어도 그 프로세스는 즉 이 명령어는 계속 실행이 된다.
# 기본적으로 nohup.out 파일에 실행 결과 저장

# 실행 결과를 pw.dat 에 저장하고, 에러메세지도 이 파일(&1) 에 백그라운드로 저장한다
nohup find / -name passwd > pw.dat 2>&1 &

작업 예약

정해진 시간에 한 번 실행 : at

  • 기능 : 예약한 명령을 정해진 시간에 실행한다.
  • 형식 : at [옵션] [시간]
### 시간 설정 방식
at 4pm + 3days 			# 지금부터 3일 후 오후 4시에 작업을 수행
at 10am jul 31 			# 7월 31일 오전 10시에 작업을 수행
at 1am tommorrow 		# 내일 오전 1시에 작업을 수행
at 10:00am today 		# 오늘 오전 10시에 작업을 수행

### at 명령 설정 예
at 04:30 pm     							# 시간 지정한 후
at> /usr/bin/ls -l ~user1 > ~user1/at.out   # 프롬프트가 뜨고 실행할 명령을 지정
at> <EOT>								    # ctrl + d 로 명령어 입력 종료 -> 작업 예약 완료

at 00:00 14-09-26 -f ./a.sh			#2014 09 26 00:00 a.sh 실행
at 00:00 2014-09-26 -f ./a.sh		#2014 09 26 00:00 a.sh 실행
									# -f 옵션 : 표준 입력 대신 실행할 명령을 파일로 지정하여
                                    # -> 특정한 시간에 그 파일을 수행하게끔 

### at 작업 파일 확인하기
# at 으로 생생된 작업 파일은 /var/spool/cron/atjobs 디렉토리에 저장.
# 작업 번호로 파일이 생성
# atjobs 디렉토리의 내용은 daemon 그룹의 사용자만 확인 가능하므로 sudo 명령을 사용
sudo ls -l /var/spool/cron/atjobs  # 결과 : 합계 4

at -l				# 예약된 작업 확인
atq 				# 현재 사용자의 at 작업들을 보여준다.
sudo atq			# 슈퍼 유저일 경우 모든 사용자의 작업 목록을 보여준다.

at -d 3 			# 3번 작업 삭제
atrm 19				# 19번 작업 삭제

at 명령 사용 제한하기

  • /etc/at.allow: at 명령의 사용이 허용된 사용자들 저장, 필요할 때 만들어야함 -> 우선순위 더 높음
    • 여기에 기술된 사용자들은 at 을 사용할 수 있다
    • 이 파일이 없으면 deny 를 제이한 모든 사용자가 at 명령 사용 가능
  • /etc/at.deny: at 명령의 사용이 금지된 사용자들 저장, 기본적으로 파일이 있음
    • 여기에 기술된 사용자들은 at 을 사용할 수 없다.
  • 만약 두 파일이 모두 없다면 root 만 at 명령을 사용 가능
  • 사용자가 두 파일 모두에 속해 있다면 at 명령 사용 가능
  • /etc/at.deny를 빈 파일로 두면 모든 사용자가 at 명령을 사용 가능(초기 설정)

정해진 시간에 반복 실행 : crontab

  • at 보다도 더 많이 사용하는 것이 crontab
  • 주기적으로 반복하는 작업을 만들 수 있다.
  • at 은 특정한 시간에 one time 에 특정 작업을 수행하는 것에 반해 crontab 은 주기를 가지고 수행
  • crontab
    • 기능 : 사용자의 crontab 파일을 관리한다.
    • 형식 : crontab [-u 사용자 ID] [옵션] [파일명]
    • 옵션
      • -e : 사용자의 crontab 파일을 편집한다. (e 로 들어가서 라인을 들어가면 되기 떄문에 -r 옵션을 잘 사용하지 x)
      • -l : crontab 파일의 목록을 출력한다.
      • -r: crontab 파일을 삭제한다.
  • 사용예
    crontab -u user1 -e 
    # user1 의 crontab 을 수정한다.
  • crontab 파일 형식
    • crontab 명령으로 관리하는 파일은 사용자별로 생성
    • crontab 파일에는 여러 개의 작업을 저장할 수 있으며 한 행에 하나의 작업을 설정
    • crontab 파일의 한 행은 다음과 같이 여섯 항목으로 구성
      • 요일은 0이 일요일, 1이 월요일, 6이 토요일을 의미
      • 공백을 기준으로 5개의 기호 또는 숫자로 주기가 설정이 됨
      • 항목의 값이 * 이면 해당 항목의 모든 값을 의미
* * * * *  분(0-59), 시간(0-23), 일(1-31), 월(1-12), 요일(0-7)  //일~일 순서.(0,7:일요일)  
  • crontab 항목 설정 예
    • 30 23 1 * * : 매월 1일날 23 시 30 분에 이 작업을 수행하라.
    • * * * * 0 : 매주 일요일날 매 분 수행
      • 0 5 10 15 매 5분 단위로 수행하기 원하면 콤마 이후 공백으로 다음 시간 연결
    • 0,5,10,15 * * * *
      • 매 5분 단위로표현할 떄는 매번 이렇게 콤마로 연결할 수 없기 떄문에*/5로 표현하기도함.
    • */2 : 2시간 마다.
crontab -e   # 텍스트 에디터로 crontab 을 연다(많이 사용)
# /var/spool/cron/crontabs -> crontab 파일 확인, 사용자 이름으로 생성
crontab -l # crontab 파일 내용 확인하기
crontab -r # crontab 으로 만든 모든 내용을 삭제

# crontab -e 옵션으로 -r 옵션을 쓰면 예약된 작업이 전부 삭제갇 되기 때문에 자 쓰지 않음


### docs 파일

$ crontab -e		//텍스트 에디터로 crontab을 연다 (많이 사용)
$ crontab -l		//현재 계정의 crontab을 보여준다 (/var/spool/cron/root 파일내용과 동일)
$ crontab -r		//현재 계정의 crontab을 지운다	

<crontab의 주기 설정>-	중요
반복 실행 : 0,10,20 * * * * [script] 	//매일 매시간 0분,10분,20분에 명령어 실행.
범위 실행 : 15-30 1 * * *  [script] 	//매일 115분 부터 30분까지 명령어 실행.	(1분 주기로)
간격 실행 :  */10 * * * * [script] 	//매 10분마다 명령어 실행.

*/10 4,5,6 16 *  * echo “happy birthday” >> /home/Minjun/test.txt
 //매달 164,5,6 시에 10분간격으로 happy birthday 를 test.txt에 append.

>  cron의 처리 내용을 저장하고 싶을때 (=로그를 남기고 싶을때)

* * * * * /home/Minjun/test.sh >> /home/Minjun/test.sh.log  2> &1 	
// 매분마다 test.sh 실행하고 결과를  test.sh.log 에 저장. 
// 에러출력은  file discriptor가 1인 표준출력을 하는 곳에 출력.

* * * * * /home/Minjun/test.sh > /dev/null 2> /dev/null 	//log와 오류내역을 저장x 싶을때.

> crontab에 저장한 내용을 주기적으로 백업해주고 싶을때
 ex) 매일 오후 1150분에 crontab의 내용을 백업해주고 싶다 :
 	 50 23 * * *crontab -l > /home/Minjun/crontab_backup.txt
profile
공부한 것 기록용

0개의 댓글