안녕하세요! 라즈베리파이 필수 네트워킹 가이드에 이어, 오늘은 시스템 운영 중 누구나 한 번쯤은 겪게 되는 무서운 상황을 해결할 수 있는 ‘프로세스 제어 및 트러블슈팅(Stopping a process)’에 대해 알아보겠습니다.

라즈베리파이 OS가 아무리 안정적이라 해도, 간혹 코딩 오작동으로 인한 무한 루프나 프로그램 자체의 버그 때문에 화면이 얼어붙거나(Freeze), 종료 버튼(QCtrl + C)을 아무리 눌러도 미동도 하지 않는 악성 소프트웨어가 발생하곤 합니다.

이럴 때 초보자분들은 당황해서 전원 케이블을 무작위로 뽑았다 켜시곤 하는데요, 이는 파일 시스템을 파괴하는 매우 위험한 행동입니다! 리눅스 환경에서는 전원을 끌 필요 없이 터미널 명령어 몇 줄로 해당 프로세스만 조용히 ‘처치(Kill)’할 수 있습니다. 시스템을 완벽하게 통제하는 프로세스 관리 기법을 총정리해 드립니다.


📊 1. 리눅스 프로세스의 뿌리, ps 명령어와 PID

리눅스 시스템에서 실행 중인 모든 프로그램은 ‘프로세스(Process)’라는 단위로 구동되며, 각각 PID(Process IDentification, 프로세스 식별 번호)라는 고유 번호를 부여받습니다.

① 전설의 명령어 ps auxww

현재 라즈베리파이에서 숨 쉬고 있는 모든 프로세스를 조회하는 가장 표준적인 명령어는 다음과 같습니다.

ps auxww

이 명령어 뒤에 붙는 옵션들은 다른 리눅스 명령어와 다르게 앞에 대시(-) 기호가 붙지 않는 독특한 형태를 띱니다. 이는 1970년대 초기 UNIX의 두 갈래 계보 중 하나인 BSD 진영의 전통이 그대로 유지된 것입니다. (System V 계열의 리눅스에서는 ps -ef 형태로 쓰이기도 하지만, 라즈베리파이 OS는 두 방식을 모두 완벽히 지원합니다.)

  • a: 나뿐만 아니라 시스템 전체 사용자의 프로세스 출력
  • x: 터미널 창에 종속되지 않고 백그라운드에서 도는 프로세스까지 포함
  • u: CPU, 메모리 점유율을 포함한 사용자 중심의 상세 포맷 변환
  • ww: 정보가 터미널 화면 오른쪽 끝에서 잘리지 않도록 강제 줄바꿈(Wrap) 처리

💡 시스템의 시초, PID 1번은 누구? ps aux 목록의 맨 첫 줄을 보면 PID 1번을 가진 systemd(과거엔 init) 프로세스를 볼 수 있습니다. 이는 시스템 전원이 켜진 후 리눅스 커널이 가장 먼저 실행하는 ‘모든 유저 공간 프로세스의 부모(Parent Process)’입니다.

② 내 타겟 프로세스만 빠르게 낚아채기

목록이 너무 방대하기 때문에, 내가 찾고자 하는 프로그램(예: vi 에디터)만 필터링할 때는 파이프 기호(|)와 grep을 조합합니다.

ps aux | grep -i vi

-i 옵션을 주면 개발자가 실수로 대문자를 섞어 쓴 프로세스명까지 대소문자 무시하고 완벽하게 찾아냅니다.


🛠️ 2. 파이프라인 연계와 현대적인 프로세스 종료 기법

① 마법 같은 한 줄 명령어 (고급 트릭)

프로세스를 찾고 PID 번호를 복사해서 kill을 치는 과정이 번거롭다면, 텍스트 가공 도구인 awk와 첫 글자를 대괄호로 감싸는 [f] 트릭을 이용해 프로세스 검색과 동시에 즉시 종료시키는 연계 명령을 구사할 수 있습니다.

kill $(ps aux | grep '[f]irefox' | awk '{print $2}')

'[f]irefox' 형태로 감싸 검색하면, grep 명령어 자체 프로세스가 검색 결과 리스트에 잡혀서 자기 자신을 kill 하려는 민망한 오류를 완벽하게 방단해 줍니다.

② 현대 리눅스의 치트키: pgreppkill

위의 복잡한 파이프라인 트릭을 쓰지 않더라도, 최신 리눅스에는 이름만으로 제어하는 훌륭한 전용 도구가 탑재되어 있습니다.

# 파이어폭스의 PID 번호만 쏙 골라내어 보기
pgrep firefox

# 파이어폭스 이름을 가진 모든 프로세스를 단번에 종료하기
pkill firefox
# 또는
killall firefox

⚠️ 주의: 이름이 비슷하다고 무차별적으로 pkill을 남용하면, 시스템 구동에 절대적인 OS 핵심 프로세스까지 의도치 않게 학살(Kill)하여 시스템 전체가 다운될 수 있으니 신중해야 합니다!


🖥️ 3. 비주얼 모니터링의 최강자, htop 활용하기

텍스트 위주의 투박한 top 명령어가 보기 힘들다면, 실시간 자원 시각화 도구인 htop을 설치하여 사용해 보세요.

sudo apt install htop
htop

htop 환경에서는 마우스나 키보드 방향키를 이용해 상하좌우 스크롤이 가능하며, 리소스 폭식범인 악성 프로세스를 하이라이트(선택)한 후 단축키 k를 누르면 터미널 명령어를 입력할 필요 없이 그 자리에서 즉시 종료 신호를 보낼 수 있습니다. (빠져나갈 때는 Q 키를 누릅니다.)

📌 시스템 얼어붙음(Freeze) 해결 긴급 팁: GUI 데스크톱 마우스 커서가 완전히 멈춰서 아무것도 할 수 없다면, 키보드의 Ctrl + Alt + F2(또는 F3~F6 중 하나)를 누르세요. 텍스트 가상 콘솔 창으로 긴급 전환됩니다. 여기서 로그인한 뒤 htop을 켜고 범인 프로세스를 잡아내면 재부팅 없이 시스템을 원상복구 할 수 있습니다!


📡 4. 알아두면 피가 되고 살이 되는 ‘4대 kill 시그널’

우리가 종료 명령을 내릴 때, 커널은 프로세스에 ‘시그널(Signal)’이라는 특수 통신 신호를 보냅니다. 그냥 무조건 죽이는 것이 아니라 정중한 요청부터 즉결 처형까지 단계가 있습니다.

시그널 명령어 시그널 이름 핵심 메커니즘 및 권장 사용 상황
kill [PID] SIGTERM (15번) [정중한 권고] 기본 시그널입니다. 프로세스에게 종료를 요청하며, 프로그램은 하던 작업을 안전하게 저장하고 자원을 반납한 뒤 우아하게 종료됩니다. (가장 먼저 시도해야 함)
kill -2 [PID] SIGINT (2번) [터미널 인터럽트] 우리가 터미널에서 Ctrl + C를 누르는 것과 완벽히 동일합니다. 프로세스를 즉시 가로막으므로 저장되지 않은 데이터 유실 가능성이 있습니다.
kill -1 [PID] SIGHUP (1번) [환경설정 새로고침] 과거엔 전화선이 끊겼을 때 쓰이던 신호였으나, 현대 리눅스의 백그라운드 서버 데몬들은 이 신호를 받으면 프로그램을 끄지 않고 ‘설정 파일만 새로고침’하여 계속 작동합니다. 안전한 무중단 서버 운영의 핵심 신호입니다.
kill -9 [PID] SIGKILL (9번) [강제 즉결 처형] 프로그램의 의사를 완전히 묵살하고 리눅스 커널이 직접 프로세스를 강제 종료시킵니다. 프로그램이 완전히 먹통(Hang)이 되어 다른 시그널에 응답하지 않는 최후의 순간에만 사용해야 합니다.

🚀 5. 터미널이 닫혀도 멈추지 않는 독립 프로세스 nohup

기본적으로 내가 SSH 원격 터미널을 열고 프로그램을 실행하다가, 창을 닫거나 와이파이가 끊기면 시스템은 자동으로 SIGHUP 신호를 보내 프로그램을 강제 종료시킵니다.

하지만 수 시간 동안 데이터를 수집해야 하는 센서 프로젝트나 백그라운드 스크립트라면 터미널 연결이 끊어져도 살아남아야 합니다. 이때 프로세스를 터미널로부터 완전히 독립시키는 도구가 바로 nohup입니다.

① nohup 표준 사용법

nohup 내프로그램 &> backgroundoutput.txt &
  • 맨 끝의 &는 프로그램을 백그라운드로 던져 터미널을 계속 쓸 수 있게 해줍니다.
  • &> 기호는 터미널 창이 없어져 볼 수 없는 프로그램의 표준 출력과 에러 로그 메시지를 지정한 텍스트 파일(backgroundoutput.txt)에 한 번에 묶어서 실시간 기록해 줍니다. (지정하지 않으면 기본적으로 nohup.out 파일이 자동 생성됩니다.)

② 원격 네트워크 재시작 응용

내가 SSH로 접속해 있는 상태에서 와이파이 장치를 내렸다가(down) 다시 올리는(up) 모험적인 작업도 nohup을 사용하면 원격 세션 단절로 인한 멈춤 현상 없이 내부적으로 매끄럽게 처리할 수 있습니다.

sudo nohup sh -c "ifconfig wlan0 down && ifconfig wlan0 up"

📝 총요약 및 마무리

라즈베리파이 기반 임베디드 프로젝트나 IoT 가동 장비를 개발할 때, 스크립트를 며칠 동안 백그라운드(nohup)에서 돌려보며 안정성을 테스트하는 과정은 필수적입니다. 이 과정에서 발생하는 리소스 누수나 프리징 현상은 오늘 배운 htopkill -9 조합으로 완벽하게 제어할 수 있습니다.

리눅스 시스템 지배력을 한 층 높이신 것을 축하드립니다!

실행 중인 프로세스가 죽지 않거나 좀비 프로세스 현상으로 골치를 앓고 계신다면 언제든 댓글로 소통해 주세요! 😊

댓글 남기기