홈 › 리눅스 운영 › 03 / 13

프로세스·서비스 관리 (systemd)

섹션 7진행 0 / 13

6. 연습 문제

문제 1. 자바 프로세스 PID 찾기

app.jar 를 실행 중인 프로세스의 PID 만 출력하는 명령을 두 가지 쓰세요.

bash
pgrep -f 'app.jar'
ps -ef | grep '[a]pp.jar' | awk '{print $2}'

[a]pp.jar 는 정규식으로는 app.jar 와 같지만 grep 명령줄 문자열 자체와는 달라 grep 자신이 걸리지 않습니다.

문제 2. 종료 코드 해석

systemctl status 에 code=killed, signal=KILL 과 함께 종료 코드 137 이 보입니다. 무슨 일이 있었을 가능성이 높은지 설명하세요.

137 은 128+9 로 KILL 신호로 죽었다는 뜻입니다. 누군가 kill -9 를 했거나, 메모리 부족으로 커널 OOM killer 가 강제 종료한 경우입니다. dmesg | grep -i 'killed process' 또는 journalctl -k 로 OOM 기록을 확인합니다. 08 레슨에서 자세히 다룹니다.

문제 3. 유닛 파일 오류 찾기

다음 유닛 파일이 시작에 실패하는 이유 두 가지를 찾으세요.

ini
[Service]
ExecStart=java -jar /opt/myapp/app.jar
Restart=always

첫째, ExecStart 가 절대 경로가 아닙니다. /usr/bin/java 로 써야 합니다. 둘째, [Install] 섹션이 없어 enable 이 안 됩니다. WantedBy=multi-user.target 을 추가합니다. User= 가 없어 root 로 뜨는 것도 고쳐야 할 점입니다.

문제 4. 안전한 정지 스크립트

PID 파일 /var/run/myapp.pid 에 적힌 프로세스에 TERM 을 보내고, 30초 안에 안 죽으면 KILL 을 보내는 명령을 쓰세요.

bash
PID=$(cat /var/run/myapp.pid)
kill "$PID"
for i in $(seq 1 30); do
  kill -0 "$PID" 2>/dev/null || { echo "정상 종료"; exit 0; }
  sleep 1
done
kill -9 "$PID" && echo "강제 종료"

kill -0 으로 1초마다 생존을 확인하는 루프가 핵심입니다. systemd 의 TimeoutStopSec 이 하는 일을 손으로 옮긴 것입니다.

문제 5. 오늘 재시작 횟수

journalctl 로 오늘 myapp 서비스가 몇 번 시작됐는지 세는 명령을 쓰세요. 시작 로그 줄에는 Started MyApp 이 들어 있습니다.

bash
journalctl -u myapp --since today | grep -c 'Started MyApp'

2 이상이면 재시작이 있었다는 뜻입니다. journalctl -u myapp --since today | grep -B5 'Started MyApp' 로 재시작 직전 로그를 함께 봅니다.