본문 바로가기
UNIX 시스템

Process Management - 14주차 수업 - 2

by 세인트킴 2023. 6. 11.

프로세스 관리 도구 - top

top [option]

주기적으로 현재 실행중인 프로세스에 대한 정보 출력 - 솔라리스 11부터 기본 패키지로 탑재

자세한 요약 정보 출력

Foreground & Background

작업(job)

쉘이 프로세스를 관리하는 단위, 쉘은 job을 시작시키고 제어(job ID)부여. 

유닉스의 프로세스는 포그라운드 작업과 백그라운드 작업으로 구분가능

Foreground 처리

사용자가 입력한 명령이 실행되어 결과가 출력될 때 까지 프롬프트가 출력되지 않아 다른 명령을 입력할 수 없는 처리 방법

* 보통의 처리 방법 

$ find / -name passwd

Backgounrd 처리

명령의 입력이 끝나면 결과에 상관없이 바로 다음 프롬프트가 출력되어 다른 명령을 입력할 수 있는 처리 방법

*명령의 끝에 &를 붙인다.

$ find / -name passwd &
[1] 5699
$

작업제어 명령 - jobs

jobs [%작업번호]
더보기
항목 출력 예제 의미
작업 번호 [1] 백그라운드 실행이 될 때마다 1씩 증가
작업 순서 +, - 작업순서를 표시
+: 가장 최근에 접근한 작업
-: + 작업보다 바로 전에 접근한 작업
공백: 그 외의 작업
상태 실행중 작업의 상태를 표시
실행중: 현재 실행중
완료됨: 작업이 정상적으로 종료
종료됨: 작업이 비정상적으로 종료
정지: 작업이 잠시 중단됨
명령 sleep 100& 실행중인 명령

작업 번호를 지정하지 않으면 백그라운드 작업을 모두 출력, 특정 작업번호를 지정하면 해당 작업의 정보만 출력.

작업번호

  • %번호: 해당 번호의 작업 정보를 출력
  • %+ or %%: 작업순서가 +인 작업 정보를 출력
  • %-: 작업 순서가 -인 작업 정보를 출력

작업 전환 및 종료 명령

명령 기능
bg [%작업번호] 현재 작업이나 특정 작업을 백그라운드로 전환시켜 실행
fg [%작업번호] 현재 작업이나 특정 작업을 포그라운드로 전환시켜 실행
Ctrl + z 포그라운드 작업을 중지시키고, 백그라운드의 중지된 목록으로 보냄
Ctrl + c 포그라운드에서 수행중인 작업을 중지
kill %n 작업번호가 n인 작업을 종료

작업제어 명령 - nohup

nohup 백그라운드 명령

로그아웃한 다음에도 지정한 백그라운드 작업이 실행완료되도록 해야 할 때 사용 - 원래는 로그아웃하면 모든 작업 종료.

명령 실행결과와 오류메세지: ./nohup.out파일에 저장

$ nohup find / -name passwd &
[1] 1411
$ Sending output to nohup.out

 


 

실습1(프로세스)

더보기

1. 다음 쉘 프로그램 hello를 작성하여 실행하시오.

#!/bin/bash
#hello

while true
do
	echo "Hello World"
    sleep 2
done

2. 다른 터미널에서 위의 프로세스를 확인하시오.

ps -u 1236 -f

UID          PID    PPID  C STIME TTY          TIME CMD

2021211+ 1151716 1149097  0 14:38 pts/596  00:00:00 /bin/bash ./hello

2021211+ 1151717 1151716  0 14:38 pts/596  00:00:00 sleep 2

./hello가 sleep2의 부모 프로세스

 

 3. sleep 2를 sleep 300으로 수정한 후 다시 실행

3-1. kill 명령으로 hello 프로세스 종료시킴

kill 1151716

3-2. sleep 프로세스는 여전히 존재하는가? 존재한다면 이 프로세스의 부모는 누구인가?

ps -u 1236 -f

UID          PID    PPID  C STIME TTY          TIME CMD

2021211+ 1151717       1  0 14:38 pts/596  00:00:00 sleep 300

부모는 ./hello였지만 고아 프로세스가 되었다.

실습2(Foreground, Background)

더보기

1. 이전 실습에서 작성한 hello 프로그램 sleep 10으로 수정 후 실행

Ctrl + C로 수행을 종료한다.

 

2. 이번엔 hello 프로그램을 background로 실행

./hello &

 

2-1. 작업 목록 확인

ps -u 1236 -f

UID          PID    PPID  C STIME TTY          TIME CMD

2021211+ 1152440 1149097  0 14:45 pts/596  00:00:00 /bin/bash ./hello

2021211+ 1152441 1152440  0 14:45 pts/596  00:00:00 sleep 10


2-3. 수행시킨 hello 종료

 kill 1152440 해도 종료가 안된다. Ctrl + C로 종료하거나, kill %1을 해서 작업을 종료시킨다.

실습3(작업 전환 및 상태 확인)

더보기

1. 다음 명령을 background로 실행 sleep 300 &

1-1. 작업 목록 확인 

ps -u 1236 -f

2021211+ 1153638 1153408  0 14:56 pts/596  00:00:00 sleep 300

1-2. 위 작업을 foreground로 전환

fg %1

sleep 300

^Z

[1]+ 멈춤 sleep 300

1-3. 위 작업의 수행을 종료 

kill %1

[1]+ 종료됨 sleep 300

 

2. 다음 명령을 foreground로 수행 sleep 300

2-1. 위 작업을 일시 정지 

sleep 300

^z

[1]+ 멈춤 sleep 300

2-2. 작업 상태 확인

ps -u 1236 -f

2021211+ 115402bg %18 1153505  0 15:00 pts/598  00:00:00 sleep 300

2-3. 정지된 작업을 background로 전환

bg %1

[1]+ sleep 300 &

2-4. 작업을 종료시킴

kill %1

실습4(작업과 프로세스)

더보기

1. 다음 명령을 수행 (sleep 60 ; echo Hello) &

1-1. 작업목록 확인

[1] 1154421

1-1. 프로세스 목록 확인 

ps -u 1236 -f

2021211+ 1154422 1154421  0 15:04 pts/596  00:00:00 sleep 60

1-2. 잠시후 화면에 출력되는 내용은?

Hello

 

2. 다시 다음 명령을 수행 (sleep 60 ; Hello) &

작업의 수행을 종료

kill %2

 

3. 다시 (sleep 60 ; Hello) & 수행

3-1. sleep 프로세스만 종료(pid값 이용). 어떤 결과가 나오는가?

kill 1154773

종료됨

Hello

실습5(작업 상태)

더보기

다음 명령을 수행 sleep 300

1. 작업을 일시 정지시킴

Ctrl + Z

2. 작업의 현재 상태는?

[1]+ 멈춤 sleep 300

3. 작업을 종료시킴

kill %1

 

다시 명령을 수행 sleep 300&

1. 작업의 현재 상태는?

[2] 1155151 

[1] 종료됨 sleep 300

2. 작업을 시그널을 이용해 일시정지시킴

kill -SIGSTOP 1155151

[2]+ 실행중

3. 작업으 시그널을 이용해 다시 재개함

kill -SIGCONT 1155151

 

다음 명령을 수행 (sleep 60 ; Hello)

1. 시그널을 이용해 일시정지

kill -SIGSTOP 1156238 부모 프로세스를 정지해야 정지된다.

2. 작업의 현재 상태는?

[1]+ 멈춤 (sleep 60; echo Hell0)

3. 시그널을 이용해 작업을 다시 재개한다.

kill -SIGCONT 1156238

4. 작업의 현재 상태는?

[1]+ 실행중 (sleep 60; echo Hello)&

5. Hello 출력은 언제 나오는가?

60초 지나고 나온다.

실습6(nohup)

더보기

1. 다음과 같은 일을 수행하는 쉘 프로그램 checkwho를 작성하여 테스트하시오

로그인되어있는 사용자 수를 다음과 같은 형식으로 60초 간격으로 출력

#!/bin/bash

while true
do
	echo $(date "+%Y/%m/%d %H:%M") 로그인 사용자 수는 $(who | wc -l)명
    sleep 60
done

 

2. nohup 명령을 이용하여 checkwho가 로그아웃 상태에서도 계속 실행되도록 하시오.

nohup ./checkwho &

[1]1159397

1. 다시 로그인 했을 때 여전히 실행중인가?

여전히 실행중이다. 백그라운드에서 계속 실행되고 있다. 

cat nohup.out 파일을 보면 추가되고 있는게 보인다.

2. 작업 목록에서 확인할 수 있는가?

[1]+ 멈춤 ./checkwho

3. 프로세스 목록에서 확인할 수 있는가?

ps -u 1236 -f

2021211+ 1159318 1153408  0 15:29 pts/596  00:00:00 /bin/bash ./checkwho

2021211+ 1159397 1153505  0 15:30 pts/598  00:00:00 /bin/bash ./checkwho

2021211+ 1159505 1159397  0 15:31 pts/598  00:00:00 sleep 60

2021211+ 1159532 1159318  0 15:31 pts/596  00:00:00 sleep 60

4. 출력 결과는 어디에서 확인할 수 있는가?

cat nohup.out 

2023/06/11 +15:30 로그인 사용자 수는 8

2023/06/11 +15:31 로그인 사용자 수는 8

2023/06/11 +15:32 로그인 사용자 수는 8

5. 관련 프로세스를 종료시키시오.

ps -u 1236 -f

UID          PID    PPID  C STIME TTY          TIME CMD

2021211+ 1153407 1153398  0 14:55 ?        00:00:00 sshd: 202121165@pts/596

2021211+ 1153408 1153407  0 14:55 pts/596  00:00:00 -bash

2021211+ 1153504 1153401  0 14:55 ?        00:00:00 sshd: 202121165@pts/598

2021211+ 1153505 1153504  0 14:55 pts/598  00:00:00 -bash

2021211+ 1160507 1153505  0 15:41 pts/598  00:00:00 ps -u 1236 -f

202121165@cslinux2:~$