상세 컨텐츠

본문 제목

[한화비전 VEDA] 7주차 리뷰

VEDA

by 전산거북이 2026. 5. 10. 22:42

본문

안녕하세요? 어김없이 찾아온 VEDA 7주차 리뷰입니다.

이번주는 사실 수업이 3일밖에 진행되지 않았습니다.
5월에는 그런 때도 있는거죠ㅋㅋ

아무튼 뭐 대개 프로세스나, 쉘 스크립트 등에 대해 수업을 진행하였습니다.

프로세스

일단 프로세스란, 프로그램의 실행 단위라고 보시면 될 듯 합니다.
그 중, Init 프로세스가 존재하는데, 이는 리눅스 커널이 부팅하면서 만들어내는 최초의 프로세스로 PID 1을 부여받게 됩니다.

기본적으로는 return을 하면 프로세스는 종료됩니다. 그러나, 모종의 이유로 종료되지 않는 경우가 존재하는데, 이를 좀비 프로세스라고 부릅니다. 좀비 프로세스는 자원과 메모리를 반환하지 않기 때문에 좀비 프로세스가 쌓이면 컴퓨터가 느려지게 됩니다.
비슷하지만 조금 다른 개념으로는 고아 프로세스가 존재합니다. 프로세스는 부모 프로세스가 자식 프로세스를 실행하며 생성됩니다. 그리고 부모 프로세스는 모든 자식 프로세스가 종료된 이후에 종료할 수 있습니다. 그러나 이 역시 모종의 이유로 자식 프로세스가 살아있는 상태에서 부모 프로세스가 먼저 죽어버리는 경우가 생길 수 있습니다. 이를 고아 프로세스라 부릅니다.

실행 중인 프로세스를 확인하기 위해서는 다음 명령어를 입력하면 됩니다.

ps -ef

모든 프로세스를 상세히 나타내라는 뜻입니다. 만약 -ef 명령어를 붙이지 않는 다면 내가 권한이 있는 프로세스만 나타납니다.

프로세스의 실행

프로세스는 스케쥴러에 의해 관리되며 실행됩니다. 멀티태스킹을 위해서는 여러 프로세스를 돌려야 하기 때문에 context switching이 자주 발생하게 되는데, 이 때 프로세스의 자원들은 control block 에서 상태를 저장하게 됩니다.
프로세스의 생애주기는 다음과 같습니다.

  1. 실행 대기 상태(runnable): 경쟁 상태입니다. 실행 대기 상태의 프로세스들은 실행이 가능한 상태입니다.
  2. 실행 상태(running): 실제로 실행중인 상태입니다.
  3. 종료 상태(terminated): 실행이 완전히 종료되어 running state로 돌아갈 수 없는 상태입니다.
  4. 중단 상태(stopped): 중단 시그널을 받아 프로세스가 멈춘 상태입니다.
  5. 수면 상태(sleep): 프로세스가 자발적으로 제어권을 포기한 상태로, 인터럽트 등에 의해 깨어날 수 있는 상태입니다.

쉘 프로그래밍

쉘 스크립트도 일반적인 프로그래밍 언어랑 비슷하게 생각할 수 있습니다.
특징이라면, 대부분 문자열로 처리를 한다는 것입니다.
숫자로 계산을 하기 위해서는 다음과 같은 방식을 사용해주어야 합니다.

let "표현식"
expr 표현식

이런식으로 작성하면 프로그래밍이 가능합니다.

뿐만 아니라, 특수한 매개변수도 사용할 수 있는데, 이는 다음과 같습니다.

  • $#: 스크립트나 함수가 입력받은 매개변수의 총 개수를 나타냅니다.
  • $@: 현 디렉토리를 나타냅니다.
  • $*: 어떤 문자든 대치할 수 있는 매개변수 입니다.
  • $0: 실행중인 스크립트 파일의 이름을 나타냅니다.

If문

if 조건
then
	명령
elif 조건
then
	명령
else
	명령
fi

위와 같은 방식으로 나타낼 수 있습니다.

if [ 표현식 ]; then
	명령
fi

이렇게도 나타낼 수 있습니다. 주의해야 할 점은 대괄호 역시 하나의 명령어로 인지하기 때문에 반드시 띄어써 주어야 한다는 것입니다.

for문

for 변수 in 목록
do
	명령
done

위와 같이 작성할 수 있습니다.

서비스 작성하기

systemd를 통해 돌고 있는 서비스를 실제로 만들어볼 수 있습니다.
우선, 데몬 서비스는 계속 돌아야 하기 때문에 일반적으로는 무한 루프의 형태로 작성합니다.
작성된 서비스 파일은 직접 실행시키는 것이 아닌, 유닛 파일을 만들어서 실행을 위임시켜주는 것이 좋으며, unit 파일은 .service 확장자를 사용합니다.
이렇게 만들어진 파일은 /etc/systemd/system에 넣어주어야 합니다.

[Unit]
Description=My Test Service

[Service]
ExecStart=/tmp/myservice.sh
Type=simple

[Install]

[Unit] 섹션에는 After, Befure, Dependency 등이 들어갑니다. 이들은 어떤 서비스가 실행된 이전/이후에 실행될 것인지 등에 대한 내용을 기술할 수 있습니다.
[Service] 섹션에서는 서비스의 유형이나 어떤 서비스를 실행할 것인지를 지정합니다. 반드시 필요한 부분입니다.
[Install] 섹션은 타겟 유저 등을 설정해줄 수 있는 섹션입니다.

실제로 실행해보면 이렇게 나옵니다.

~$ sudo systemctl status myservice

myservice.service
	Loaded: loaded (/etc/systemd/system/myservice.service; disabled; preset: enabled)
	Active: inactive (dead)
	...
	
~$ sudo systemctl enable myservice
Created symlink '/etc/systemd/multi-user.target.wants/myservice.service' -> '/etc/systemd/system/myservice.service'.

~$ sudo systemctl status myservice
myservice.service
	Loaded: loaded (/etc/systemd/system/myservice.service; enabled; preset: enabled)
	Active: inactive (dead)
	...
	
~$ sudo systemctl start myservice

~$ sudo systemctl stop myservice

~$ sudo systemctl status myservice
myservice.service
	Loaded: loaded (/etc/systemd/system/myservice.service; disabled; preset: enabled)
	Active: inactive (dead)
	...
	
May 08 10:49:16 Ubuntu systemd[1]: Started myservice.service.
May 08 10:49:16 Ubuntu myservice.sh[6845]: my service is running...
...

systemctl을 통해 myservice에 대해 확인해보면, disabled 되어있다고 되어있습니다. 이를 enable로 변경해주고, start 명령을 통해 myservice를 실행할 수 있습니다.
서비스를 멈추고 싶다면 stop 명령어를 사용하면 됩니다.

관련글 더보기

댓글 영역