728x90
프로세스
프로세스의 부모-자식 관계
- 프로세스: 현재 시스템에서 실행 중인 프로그램
- 하드디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화된 것
- 모든 프로세스는 부모-자식 관계를 가지고 있음
- 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있음
- 자식 프로세스는 할 일이 끝나면 부모 프로세스에 결과를 돌려주고 종료
- 사용자가 vi를 실행하여 Shell이 vi 프로세스를 생성할 경우
- → Shell은 부모 프로세스가 되고 vi는 자식 프로세스가 됨
- 사용자가 vi를 종료하면 다시 부모 프로세스인 Shell로 돌아감
- 사용자가 vi를 실행하여 Shell이 vi 프로세스를 생성할 경우
프로세스의 번호
- PID
- 각 프로세스는 고유한 번호를 가지고 있음 그 번호를 PID 라고 함
- PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여
프로세스의 종류
- 포그라운드 프로세스(Foreground Process)
- 실행하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스
- 대부분의 응용프로그램
- 백그라운드 프로세스(Background Process)
- 실행은 되었지만, 화면에는 나타나지 않고 실행되는 프로세스
- 백신 프로그램, 서버 데몬 등
- 데몬 프로세스(Daemon Process)
- 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행
- 고아 프로세스(Orphan Process)
- 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료된 자식 프로세스는 고아 프로세스
- 1번 프로세스가 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스의 작업 종료 지원
- 좀비 프로세스(Zombie Process)
- 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우
- 좀비 프로세스는 프로세스 목록에 defunct 프로세스라고 나오기도 함
- 좀비 프로세스가 증가하면 포로세스 테이블의 용량이 부족해서 일반 프로세스가 실행되지 않을 수도 있음
프로세스 목록 확인
ps 명령
- 실행 중인 프로세스의 목록을 보는 명령
- ps
- 기능: 현재 실행 중인 프로세스에 대한 정보를 출력
- 형식: ps [옵션]
- 옵션
- <유닉스(SVR4) 옵션>
- -e : 시스템에서 실행 중인 프로세스의 정보를 출력
- -f : 프로세스에 대한 자세한 정보를 출력
- -u ; uid: 특정 사용자에 대한 프로세스의 정보를 출력
- -p ; pid: pid로 지정한 특정 프로세스의 정보를 출력
- ※ 유닉스(SVR4) 옵션; 묶어서 사용할 수 있고, 붙임표로 시작 (-ef)
- <BSD 옵션>
- a : 터미널에서 실행시킨 프로세스의 정보를 출력
- u : 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보를 출력
- x : 시스템에서 실행 중인 모든 프로세스의 정보를 출력
- <GNU 옵션>
- --pid <PID> <목록> : 목록으로 지정한 특정 PID 정보를 출력
- <유닉스(SVR4) 옵션>
- 사용 예
ps ps -ef ps aux
- 현재 단말기의 프로세스 목록 출력하기: $ ps
- ps 명령을 옵션 없이 사용하면 현재 Shell이나 터미널에서 실행한 사용자 프로세스의 정보를 출력
- PID: 프로세스 번호
- TIME: 해당 프로세스가 사용한 CPU 시간의 양
- TTY: 현재 터미널 번호
- CMD: 프로세스가 실행 중인 명령
$ ps PID TTY TIME CMD 1280 tty1 00:00:00 bash 1337 tty1 00:00:00 ps
- ps 명령을 옵션 없이 사용하면 현재 Shell이나 터미널에서 실행한 사용자 프로세스의 정보를 출력
- 프로세스 상세 정보 출력하기: -f 옵션
- -f 옵션은 프로세스의 상세한 정보를 출력
- PPID와 터미널 번호, 시작 시간 등의 정보가 추가로 출력
항목 의미 UID 프로세스를 실행한 사용자 ID PID 프로세스 번호 PPID 부모 프로세스 번호 C CPU 사용량(% 값) STIME 프로세스의 시작 날짜나 시간 TTY 프로세스가 실행된 터미널의 종류와 번호 TIME 프로세스 실행 시간 CMD 실행되고 있는 프로그램 이름(명령) - 터미널에서 실행시킨 프로세스 정보 출력하기: a 옵션
- a 옵션은 터미널에서 실행시킨 프로세스의 정보를 출력
- 출력 내용 중 STAT는 프로세스의 상태를 나타냄
문자 의미 비고 R 실행 중(Running) S 인터럽트가 가능한 대기(sleep) 상태 T 작업 제어에 의해 정지된(stopped) 상태 Z 좀비 프로세스(defunct) STIME 프로세스의 시작 날짜나 시간 s 세션 리더 프로세스 BSD 형식 + 포그라운드 프로세스 그룹 BSD 형식 l(소문자 L) 멀티스레드 BSD 형식
- a 옵션은 터미널에서 실행시킨 프로세스의 정보를 출력
- 터미널에서 실행시킨 프로세스 상세 정보 출력하기: a 옵션과 u 옵션
- a 옵션과 u 옵션을 함께 사용하면 터미널에서 실행한 프로세스의 상세 정보를 출력
- 단순히 a 옵션이나 -f 옵션을 사용한 것과 비교해보면 CPU와 메모리 사용량 등 추가적인 정보가 출력
항목 의미 USER 사용자 계정 이름 %CPU 퍼센트로 표시한 CPU 사용량 %MEM 퍼센트로 표시한 물리적 메모리 사용량 VSZ 사용 중인 가상 메모리의 크기(KB) RSS 사용 중인 물리적 메모리의 크기(KB) START 프로세스 시작 시간 - 전체 프로세스 목록 출력하기(UNIX 옵션): -e 옵션과 -f 옵션
- 전체 프로세스의 더 자세한 정보를 확인하려면 -e 옵션과 -f 옵션을 함께 사용해야 함
- 두 옵션을 함께 사용할 때는 -ef를 입력
- 전체 프로세스 목록 출력하기(BSD 옵션): ax 옵션과 aux 옵션
- ax 옵션: -e 옵션과 마찬가지로 시스템에서 실행 중인 모든 프로세스를 출력
- aux 옵션: -ef 옵션처럼 시스템에서 실행 중인 모든 프로세스에 대한 자세한 정보를 출력
- 특정 사용자의 프로세스 목록 출력하기: -u
- -u 옵션: 사용하면 특정 사용자가 실행한 프로세스의 목록을 확인할 수 있음
- 더욱 상세한 정보를 보고 싶으면 -f 옵션을 함께 사용, 이 경우 -u 옵션이 -f 뒤에 와야 함
- ※ -u 옵션 바로 뒤에 -u Option’s argument(인자)가 와야 uid 인식 가능
- 특정 프로세스 정보 출력하기: -p 옵션
- -p 옵션과 함께 특정 PID를 지정하면 해당 프로세스의 정보를 출력할 수 있음
- -f 옵션을 함께 사용하는 것이 좋음
특정 프로세스 정보 검색
- 특정 프로세스 정보 검색: ps
- ps 명령과 grep 명령을 |(Pipeline)로 연결하여 특정 프로세스에 대한 정보를 검색할 수 있음
- ‘$ ps -ef | grep’의 형태로 연결해서 사용
- Ex. $ ps -ef | grep bash
- 특정 프로세스 정보 검색: pgrep
- pgrep 명령: ps와 grep을 하나로 통합하여 만든 명령
- 기본적으로 인자로 지정한 패턴과 일치하는 프로세스를 찾아 PID를 알려줌
- 옵션의 지정에 따라 검색 내용이 다양
- pgrep
- 기능: 지정한 패턴과 일치하는 프로세스의 정보를 출력
- 형식: pgrep [옵션] [패턴]
- 옵션
- -x : 패턴과 정확히 일치하는 프로세스의 정보를 출력
- -n : 패턴을 포함하고 있는 가장 최근 프로세스의 정보를 출력
- -u <사용자 이름> : 특정 사용자에 대한 모든 프로세스를 출력
- -l : PID와 프로세스 이름을 출력
- -t <term> : 특정 단말기와 관련된 프로세스의 정보를 출력
- 사용 예
- $ pgrep bash
- pgrep
- bash 패턴을 지정하여 검색한 예
- pgrep의 경우 -l 옵션을 지정해도 단지 PID와 명령 이름만 출력
- $ pgrep -l bash
- -x 옵션을 지정하여 패턴과 정확히 일치하는 프로세스의 정보 출력
- $ pgrep -x bash
- 더 자세한 정보를 검색하려면 pgrep 명령을 ps 명령과 연결하여 사용
- $ ps -fp $(pgrep -x bash)
- -u 옵션으로 사용자명을 지정하여 검색
- $ ps -fp $(pgrep -u ec2-user bash)
- pgrep의 경우 -l 옵션을 지정해도 단지 PID와 명령 이름만 출력
프로세스 종료
시그널
- 프로세스에 무언가 발생했음을 알리는 간단한 메시지
- 프로세스를 종료하는 데 kill이나 pkill 명령을 사용 : 시그널을 보내 프로세스를 종료
- 리눅스에서 지원하는 시그널의 목록은 kill -l 명령으로 알 수 있음
- $ kill -l
주요 시그널
시그널 | 번호 | 기본 처리 | 의미 |
SIGHUP | 1 | 종료 | 터미널과의 연결이 끊어졌을 때 발생한다. |
SIGINT | 2 | 종료 | 인터럽트로 사용자가 [Ctrl] + c를 입력하면 발생한다. |
SIGQUIT | 3 | 종료, 코어덤프 | 종료 신호로 사용자가 [Ctrl] + \을 입력하면 발생한다. |
SIGKILL | 9 | 종료 | 이 시그널을 받은 프로세스는 무시 할 수 없으며 강제로 종료한다. |
SIGALRM | 14 | 종료 | 알람에 의해 발생한다. |
SIGTERM | 15 | 종료 | kill 명령이 보내는 기본 시그널 |
kill : 프로세스 종료
- kill
- 기능: 지정한 시그널을 프로세스에게 보낸다
- 형식: kill [-SIG] PID …
- 시그널
- 2 : 인터럽트 시그널을 보낸다([Ctrl] + c)
- 9 : 프로세스를 강제로 종료한다.
- 15 : 프로세스와 관련된 파일을 정리하고 종료한다. 종료되지 않은 프로세스가 있을 수 있다.
- 사용 예
kill 1001 kill -15 1001 kill -9 1001
- kill 명령은 인자로 지정한 프로세스에 시그널을 전달
- 프로세스는 각 시그널을 받았을 때 어떻게 처리할 것인지 동작이 지정되어 있음
- kill 명령에서 시그널을 지정하지 않을 경우 15번 시그널로 간주
- 15번 시그널은 일반적으로 프로세스 종료이지만, 시그널을 무시하거나 다른 동작을 하도록 지정되어 있다면 프로세스가 종료되지 않을 수 있음
- 9번 시그널은 강제 종료이기 때문에 무조건 종료되지만 좀비 프로세스의 경우 9번 시그널을 받아도 종료되지 않을 수 있음
프로세스 관리 도구
top 명령
- 현재 실행 중인 프로세스에 대한 정보를 주기적으로 출력
- 프로세스의 자세한 요약 정보를 상단에 출력하고 각 프로세스의 정보를 하단에 출력
항목 | 의미 |
PID | 프로세스 ID |
USER | 사용자 계정 |
PR | 우선 순위 |
NI | Nice 값 |
VIRT | 프로세스가 사용하는 가상 메모리의 크기 |
RES | 프로세스가 사용하는 메모리의 크기 |
SHR | 프로세스가 사용하는 공유 메모리의 크기 |
%CPU | 퍼센트로 표시한 CPU 사용량 |
%MEM | 퍼센트로 표시한 메모리 사용량 |
TIME+ | CPU 누적 이용 시간 |
COMMAND | 명령 이름 |
포그라운드 작업과 백그라운드 작업
포그라운드 작업
- 포그라운드 프로세스
- 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식으로 처리되는 프로세스
- 이를 작업 제어에서는 포그라운드 작업이라고 함
- 일반적으로 사용자가 명령을 실행하는 방식
- 프롬프트가 출력되지 않아 다른 명령을 입력할 수 없으므로 기다려야 함
- → 명령이 모두 실행된 후 프롬프트 실행
- Ex. $ sleep 30
- → 명령이 모두 실행된 후 프롬프트 실행
백그라운드 작업
- 백그라운드 프로세스
- 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있음
- 작업 제어에서는 백그라운드 작업이라고 함
- 명령의 실행 시간이 많이 걸릴 것으로 예상되거나 명령을 실행한 후 다른 작업을 할 필요가 있을 때 많이 사용
- Ex. $ sleep 100 &
- 기존의 작업 화면과 백그라운드 작업 결과가 뒤섞인 채 터미널 화면에 출력될 수 있음
- 백그라운드로 처리할 때는 다음과 같이 출력과 오류 방향을 전환하고, 실행 결과와 오류 메세지를 파일로 저장하는 방법을 사용하여 문제를 해결
- find / -name paswwd:
- / : Root Dir 의미, 시스템의 모든 디렉터리 대상으로 검색
- -name <string> : 이름이 ‘string’인 파일을 찾아라
- 즉, 시스템 전체에서 ‘passwd’라는 이름을 가진 파일을 찾는다.
- find : 파일을 검색하는 명령
$ find / -name passwd > pw.dat 2>&1 &
- find / -name paswwd:
작업 제어
- 작업 제어는 작업 전환과 작업 일시 중지, 작업 종료를 읨
- 작업 전환: 포그라운드 작업 → 백그라운드 작업, 백그라운드 작업 → 포그라운드 작업으로 전환
- 작업 일시 중지: 작업을 잠시 중단
- 작업 종료: 프로세스를 종료하는 것처럼 작업을 종료
jobs : 작업 목록 보기
-
- 기능: 백그라운드 작업을 모두 보여준다. 특정 작업 번호를 지정하면 작업 정보만 보여준다.
- 형식: $ jobs [%작업번호]
- %작업번호:
- %번호 : 해당 번호의 작업 정보를 출력
- %+ 또는 %% : 작업 순서가 +인 작업 정보를 출력한다.
- %- : 작업 순서가 -인 작업 정보를 출력
- 사용 예
- $ jobs %1
- $ jobs
항목 | 출력 예 | 의미 |
작업 번호 | [1] | 작업 번호로서 백그라운드로 실행할 땜다 순차적으로 증가한다([1], [2], [3], …). |
작업 순서 | + | 작업 순서를 표시 + : 가장 최근에 접근한 작업 - : + 작업보다 바로 전에 접근한 작업 공백 : 그 외의 작업 |
상태 | 실행 중 | 작업 상태를 표시 Running : 현재 실행 중 Done : 작업이 정상적으로 종료 Terminated : 작업이 비정상적으로 종료 Stopped : 작업이 잠시 중단 |
명령 | sleep 100 & | 백그라운드로 실행 중인 명령 |
작업 전환하기
명령 | 기능 |
[Ctrl] + z | 포그라운드 작업을 중지(종료하는 것이 아니라 잠시 중단하는 것이다) |
bg %작업 번호 | 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환 |
fg %작업 번호 | 작업 번호가 지시하는 작업을 포그라운드 작업으로 전환 |
작업 종료하기
- 포그라운드 작업은 [Ctrl] + c를 입력하면 대부분 종료
- 백그라운드 작업은 kill 명령으로 강제 종료: PID 또는 %작업 번호
작업 예약
로그아웃 후에도 백그라운드 작업 계속 실행하기
- nohup 명령 : 로그아웃한 다음에도 작업이 완료될 때까지 백그라운드 작업을 실행해야 할 경우에 사용
- nohup
- 기능: 로그아웃한 후에도 백그라운드 작업을 계속 실행
- 형식: $ nohup 명령 &
- 실행 시, log 파일: nohup.out
- 날짜 별로 파일이 만들어지고 백업 파일도 설정 가능하다.
- Ex. nohup 실행 시, log 파일(nohup.out) 생성하지 않기
- $ nohup <command> 1>/dev/null 2>%&1 &
- nohup
- 지정한 파일에 결과와 오류 메시지를 출력
- 다시 로그인하여 파일 내용 살펴보기
정해진 시간에 실행
- 특정한 시간에 작업을 실행하도록 예약할 수 있는 두 가지 방법
- 정해진 시간에 한 번만 수행 Ex. at Command
- 정해진 시간에 반복 수행 Ex. crontab Command(AWS에서 막혀 있음!~AutoScaling Scheduling이 crontab이기에)
- at 명령 : 정해진 시간에 한 번만 명령을 실행할 때 사용
- 기능: 예약한 명령을 정해진 시간에 실행
- 형식: at [옵션] [시간]
- 옵션
- -l : 현재 실행 대기 중인 명령의 전체 목록을 출력(atq 명령과 동일)
- -r <작업 번호> : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제한다(atrm과 동일)
- -m : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려준다
- -f <파일> : 표준 입력 대신 실행할 명령을 파일로 지정
- 사용 예
- $ at 10:00 pm
- $ at 8:15 am May 30
- $ at -m 0730 tommorow
- at 명령을 사용하여 정해진 시간에 명령을 실행하도록 예약하려면 at 명령 뒤에 시간을 명시
- 시간을 지정하는 형식
- at 4pm + 3 days : 지금부터 3일 후 오후 4시에 작업을 수행
- at 10am Jul 31 : 7월 31일 오전 10시에 작업을 수행
- at 1am tomorrow : 내일 오전 1시에 작업을 수행
- at 10:00am today : 오늘 오전 10시에 작업을 수행
- at로 실행할 명령은 기본적으로 표준 입력으로 지정: 명령의 입력을 마치려면 [Ctrl] + d 입력
- 시간을 지정하는 형식
- at 작업 파일 확인하기
- at로 생성된 작업 파일은 /var/spool/at 디렉터리에 저장
- $ sudo ls -l /var/spool/at
- ※ root 사용자만 /var/spool/at 디렉터리 내용 확인 가능
- $ sudo ls -l /var/spool/at
- at로 생성된 작업 파일은 /var/spool/at 디렉터리에 저장
- at 작업 목록 확인하기: -l 옵션, atq 명령
- at 명령으로 설정된 작업의 목록은 -l 옵션으로 확인
- 출력 형식: 각 작업 당 한 줄로 작업 번호, 날짜, 시간, 작업 구분 순
- $ at -l
- -l 옵션 외에 atq 명령도 실행 대기 중인 작업의 목록을 출력
- atq
- 기능: 현재 사용자의 등록된 작업 목록을 보여준다. 슈퍼 유저일 경우 모든 사용자의 작업 목록을 보여준다
- 형식: $ atq
- ※ at -l과 같은 형식으로 출력됨
- atq
- at 작업 삭제하기: -d 옵션과 atrm 명령
- at 명령으로 설정한 작업이 실행되기 전에 삭제하려면 -d 옵션을 사용하고 삭제할 작업 번호를 지정
- atrm은 at -d와 같은 기능을 수행
- atrm
- 기능: 지정된 작업 번호의 작업을 삭제
- 형식: $ atrm <작업 번호>
- atrm
정해진 시간에 반복 실행
- crontab 명령: 지정 시간이 되면 반복적으로 실행하도록 설정
- crontab
- 기능: 사용자의 crontab 파일을 관리
- 형식: crontab [-u 사용자ID] [옵션] [파일명]
- 옵션
- -e : 사용자의 crontab 파일을 편집
- -l : crontab 파일의 목록을 출력
- -r : crontab 파일을 삭제
- 사용 예
- $ crontab -u user1 -e
- $ crontab -r
- $ crontab -l
- crontab
- crontab 파일 형식
- Ex. 30 23 1 * * /usr/bin/ls -l ~user1 > ~user/cron.out
- ← 4번째인 월 항목은 매월을, 5번째인 요일 항목은 모든 요일을 의미
- Ex. 30 23 1 * * /usr/bin/ls -l ~user1 > ~user/cron.out
분(0~59) | 시(0~23) | 일(1~31) | 월(1~12) | 요일(0~6) | 작업 내용 |
- crontab 파일 생성하고 편집하기 : crontab -e
- crontab 파일의 생성과 편집은 crontab -e 명령으로 수행
- crontab -e 명령으로 수행할 작업을 하나 작성
- Ex. $ crontab -e
- crontab -e 명령으로 편집한 파일을 저장하면 자동으로 /var/spool/cron 디렉터리에 사용자 이름으로 생성
- Ex.
- $ sudo su -
- # ls -l /var/spool/cron/
- # cat /var/spool/cron/<userID>
- Ex.
- crontab 파일 내용 확인하기: crontab -l
- $ crontab -l
- crontab 실행: systemctl start crond
- $ sudo systemctl start crond
- $ sudo systecmtl status crond # crond 데몬 상태 확인
- crontab 파일 삭제: crontab -r
- $ crontab -r
- $ crontab -r
- $ corntab -l
728x90
'02. Linux & AWS' 카테고리의 다른 글
06. FTP (0) | 2024.10.27 |
---|---|
05. 소프트웨어 관리 (2) | 2024.10.27 |
03. 링크 & 셸 (0) | 2024.10.20 |
02. AWS EC2 설정, Linux 기본 명령어, 사용자&그룹 (0) | 2024.10.20 |
Linux 개요 (0) | 2024.10.20 |