포어그라운드 프로세스와 백그라운드 프로세스
리눅스는 프로세스를 실행하는 방식에 따라 포어그라운드(foreground) 프로세스와 백그라운드(background) 프로세스로 구분한다. 둘을 나누는 가장 큰 기준은 프로그램과 사용자 간 인터페이스이다.
셸은 한 프로그램을 실행하면 그 프로그램이 종료돼야 다음 명령을 실행한다. 실행 시간이 짧은 프로그램은 별다른 문제가 없다. 사용자와 상호작용이 필요한 프로그램도 문제없다. 하지만 사용자와 상호작용이 필요하지 않고, 실행 시간도 긴 프로그램이라면 어떨까? 셸은 해당 프로그램이 종료될 때까지 대기해야 한다. 그리고 프로그램이 종료되기 전까지 다른 작업을 수행하지 못한다.
포어그라운드 프로세스는 사용자와 상호작용이 기본이기 때문에 사용자 입력을 받을 수 있다. 사용자 입력은 복수의 프로세스가 받을 수 없다. 그래서 하나의 셸에서 실행할 수 있는 포어그라운드 프로세스는 1개이다. 반면, 백그라운드 프로세스는 사용자와 상호작용 없음이 기본이다. 그래서 사용자 입력이 프로세스와 연결되지 않는다. 그래서 셸에서 백그라운드 프로세스를 여러개 실행할 수 있다.
셸에서 프로그램을 실행할 때 포어그라운드 프로세스나 백그라운드 프로세스로 실행하도록 지정할 수 있다. 또한, 포어그라운드 프로세스로 실행된 프로세스를 백그라운드로 보내거나, 백그라운드 실행된 프로세스를 포어그라운드로 가져올 수도 있다.
ping 명령어
ping 명령어는 네트워크 연결 상태를 확인하는데 사용한다. ping은 ICMP(Internet Control Message Protocol)의 에코 요청(echo request) 패킷을 대상 호스트로 보낸다. 그리고 에코 응답(echo reply)을 받아 해당 호스트가 네트워크에 접근 가능한지 확인한다. 보안상 ICMP 에코 요청에 응답하지 않는 호스트도 있다. 그러므로 ping 명령어가 실패한 것으로 네트워크에 연결되지 않았다고 판단할 수는 없다.
ping 명령어를 사용하면 기본적으로 1초에 한 번씩 에코 요청을 보내고, 결과를 화면에 출력하는 행위를 무한히 반복한다. 사용자는 Ctrl + C를 눌러 ping 명령어를 종료할 수 있다.
$ ping [option] [target]
대상 부분에는 에코 요청을 보낼 대상을 입력한다. IP주소를 입력해도 좋고, 도메인 주소를 입력할 수도 있다.
ping 명령어의 주요 옵션
- -c 횟수 : 에코 요청을 보낼 횟수를 지정한다.
- -i 간격 : 연속적인 에코 요청의 시간 간격(초)을 지정한다.
- -s 크기 : 보낼 패킷의 크기(바이트 단위)를 지정한다.
- -q : 조용한 출력 모드로, 프로그램 종료 시 요약된 정보만 보여준다.
이제 8.8.8.8을 대상으로 ping 명령어를 실행한다. 8.8.8.8은 구글에서 운영하는 공개 DNS(Domain Name System) 서버의 IP 주소이다. 이 서버는 항상 ICMP 에코 요청에 응답하므로 내 컴퓨터의 인터넷 연결 여부를 확인할 때 자주 사용한다.
$ apt-get install iputils-ping
포어그라운드 프로세스로 실행하기
먼저 포어그라운 프로세스로 실행해 보자. 터미널을 열고 아무런 옵션 없이 ping 8.8.8.8을 실행한다. 인터넷에 연결된 상태라면 1초에 한 번씩 에코 요청을 보내고 응답이 돌아오는 데 걸린 시간을 출력한다.
셸에서 실행하는 프로그램은 기본적으로 포어그라운드 프로세스로 실행된다. ping 프로그램도 포어그라운드 프로세스로 실행되므로 셸은 프로세스가 종료될 때까지 기다린다. ping 프로그램은 -c 옵션으로 횟수를 지정하지 않으면 에코 요청을 무한히 반복한다.
Ctrl + c를 누르면 ping 프로그램을 종료한다. 셸은 실행하던 프로그램이 종료되면 새로운 프롬프트를 띄워 사용자 입력을 기다린다.
이번에는 -c 옵션을 설정해서 ping을 실행해보자. 에코 요청/응답을 2회 수행한 후 프로그램이 종료된다. 그 후 셸은 새로운 프롬프트를 띄운다.
$ ping -c 2 8.8.8.8
백그라운드 프로세스 실행하기
이번에는 백그라운드 프로세스로 실행해보자. 프로그램을 백그라운드 프로세스로 실행할 때는 명령 끝에 &을 붙여준다. 에코 요청 횟수를 3회로 지정해 실행한다.
$ ping -c 2 8.8.8.8 &
포어그라운드 프로세스로 실행핬을 때와 다른 점을 확인할 수 있다. 프로그램을 백그라운드로 실행하면 바로 다음 줄에 실행된 프로세스가 작업 번호 ([1])와 PID(56)가 출력되고, 바로 새로운 프롬프트가 뜬다. 그 뒤로 ping 명령어의 출력 텍스트가 화면에 출력되고 수행한 후에 실행이 종료된다. 이후 아무 일도 일어나지 않은 채 커서만 깜빡인다. 이때 Enter를 누르면 작업 번호 1번 프로세스가 종료됐다는 메시지가 나오고, 새로운 프롬프트가 뜬다. 백그라운드 프로세스가 종료됐음을 보여주는 메시지이다.
백그라운드 프로세스로 실행되는 와중에는 Ctrl + c를 입력해도 백그라운드 프로세스에 전달되지 않는다. 그래서 ping 프로그램이 종료되지 않는다.
백그라운드 프로세스로 전환하기
포어그라운드 프로세스를 백그라운드로 보내보자. 프로그램의 출력이 너무 많으면 복잡하니 ping 명령어에 -q 옵션을 사용해 ping 프로그램이 종료될 때만 결과를 출력하자. 포어그라운드 프로세스를 백그라운드로 보내려면 먼저 프로세스를 중단시켜야 한다. 프로세스가 중단된 후에야 프로세스를 백그라운드로 보내 실행할 수 있다. 포어그라운드 프로세스를 중단한 다음 bg 명령어를 실행하면 프로세스가 백그라운드에서 실행된다.
$ ping -q -c 10 8.8.8.8
-c 옵션으로 횟수를 10번으로 늘리고 실행하자. 그리고 실행 이후에 Ctrl + z 명령어를 입력해서 프로세스를 중단시키자.
$ bg
백그라운드에서 실행되던 ping 프로세스가 종료되 후에 Enter를 누르면 백그라운드에서 실행되던 ping 프로세스가 종료됐음을 알려준다.
포어그라운드 프로세스로 전환하기
백그라운드 프로세스나 중단된 프로세스가 있을 때 fg 명령어를 실행하면 해당 프로세스를 포어그라운드에서 실행할 수 있다.
$ ping -c 10 8.8.8.8 &
$ fg
ping 프로그램을 백그라운드 프로세스로 실행시킨 다음에 fg 명령어를 이용해서 포어그라운드 프로세스로 변경해서 Ctrl + c 명령어로 바로 중지시키는 게 가능하다.
여러 프로세스 다루기
여러 프로세스의 상태 확인과 실행 모드를 조회할 때는 jobs 명령어를 사용한다. jobs 명령어는 현재 셸 세션에서 실행 중인 작업의 상태를 표시한다. 이 명령어는 백그라운드로 실행되거나 중단된 작업 목록, 각 작업의 작업 번호(job number)와 상태(실행 중, 중단, 종료 등)를 함께 제공한다. jobs 명령어는 시스템 관리자나 사용자가 현재 셸 세션에서 실행되는 작업을 관리하는 데 사용한다. 특히, 여러 작업을 동시에 실행시키거나 백그라운드 작업을 관리할 때 효과적이다.
$ jobs [option] [job]
jobs 명령어의 주요 옵션
- -l : 작업을 나열하면서 PID도 출력한다.
- -r : 실행 중인 작업만 나열한다.
- -s : 중단된 작업만 나열한다.
ping 프로그램을 몇 개를 백그라운드에서 실행해 보자.
$ ping -q -c 600 8.8.8.8 &
$ ping -q -c 600 www.google.com &
$ ping -q -c 600 www.wikipedia.org &
$ jobs
$ jobs -l
fg 명령어를 이용하면 백그라운드 프로세스를 포어그라운드로 가져올 수 있다. 이때 job number를 입력해서 해당하는 백그라운드 프로세스를 선택하여 가져올 수 있다. job number를 입력하지 않으면 가장 최근에 실행한 프로세스를 가져온다.
$ fg [job number]
함께 읽으면 좋은 글
[Linux] 리눅스 프로세스 작업 전환 (Background, Foreground)
목차 1. 포그라운드와 백그라운드 1.1. 포그라운드(Foreground) • 입력한 명령어 실행이 결과가 나올 때까지 기다리는 방식 • 한 동작을 수행할 동안 다른 동작은 할 수 없는 상태 • 포그라운드 작
veneas.tistory.com
'프로그래밍 > 리눅스' 카테고리의 다른 글
리눅스(Linux) 리디렉션(Redirection)을 알아보자 (0) | 2025.02.09 |
---|---|
리눅스(Linux) IPC의 종류에 대해서 알아보자 (0) | 2025.02.04 |
리눅스(Linux) 프로세스의 작동 (0) | 2025.01.31 |
리눅스(Linux) 소유권과 권한 (0) | 2025.01.28 |
리눅스(Linux) 사용자(User)와 사용자 그룹(User Group) 예제 (0) | 2025.01.28 |
댓글