KeepWorlds

팰월드 자동 일시정지: 무엇이 멈추고 무엇을 잃나

팰월드 서버의 자동 일시정지는 서로 다른 두 기능을 가리켜요. 접속자가 없는 동안 팰이 굶지 않게 해 주는 건 그중 하나뿐이에요. 어떻게 동작하고 무엇이 깨지는지 정리했어요.

하루 만에 접속했더니 거점이 엉망이에요. 팰 절반은 배가 고프고 둘은 병이 났고, 상자에는 아무도 시키지 않은 광석이 가득해요. 그동안 아무도 접속하지 않았는데 월드만 계속 돌아간 거예요. 이 얘기를 꺼내면 돌아오는 답이 자동 일시정지고요.

그런데 이 말은 서로 다른 두 기능을 가리키고, 그중 하나는 원하는 결과를 주지 않아요. 고르기 전에 구분부터 해 둬요.

자동 일시정지가 가리키는 두 가지

요금을 멈추는 쪽. 접속자가 없는 구간은 과금하지 않는 방식이에요. 요금이 멈추려면 뭔가는 꺼져 있어야 하니 월드도 대개 같이 멈추지만, 이 기능이 내세우는 건 가격이에요. 정작 중요한 건 그다음이에요. 어떻게 내려가고, 다시 올라오는 데 얼마나 걸리는지.

월드를 멈추는 쪽. 게임 속 시간이 더 이상 흐르지 않아요. 팰이 먹지 않고 작물이 자라지 않고, 아무도 없는 거점에 습격도 오지 않아요.

어느 쪽을 파는 건지는 두 가지만 물어보면 갈려요. 일시정지 중에 월드가 흘러가나요, 그리고 다시 플레이할 수 있기까지 얼마나 걸리나요. 기능 목록의 어떤 항목보다 두 번째 질문이 구현을 잘 갈라놔요.

아무도 없는데 월드가 계속 흐르는 이유

전용 서버는 그냥 계속 돌아가는 프로세스예요. 마지막 사람이 나갔다고 쉬지 않고, 만원일 때와 똑같은 주기로 월드를 계산해요. 거점의 팰은 계속 일하고 계속 배가 고파지고, 작물은 자라고, 아무도 지키지 않는 거점에도 습격 이벤트는 그대로 와요.

게임 안에서 여는 방식(한 명이 월드를 열고 나머지가 붙는 방식)으로 하다 온 팀이라면 여기서 습관이 어긋나요. 그쪽은 월드가 그 사람의 게임 안에 있어서, 그 사람이 종료하면 월드도 멈춰요. 전용 서버는 일부러 반대로 만든 물건이에요. 아무 때나 들어올 수 있도록 떠 있다는 건, 아무도 안 들어오는 시간에도 똑같이 떠 있다는 뜻이거든요. 두 방식이 월드를 각각 어디에 두는지는 팰월드 멀티플레이 방식 비교에 있어요.

자동 일시정지는 실제로 어떻게 동작하나

시중의 자동 일시정지 대부분은 운영체제 시그널 두 줄이 본체예요.

kill -STOP <pid>   # 그 자리에서 얼림
kill -CONT <pid>   # 하던 자리부터 다시

SIGSTOP은 팰월드 명령이 아니고, 게임은 이런 일이 있었다는 것조차 몰라요. 커널이 그 프로세스에 CPU를 더 주지 않을 뿐이에요. 메모리도 열어 둔 파일도 UDP 포트도 그대로 쥔 채로 실행만 안 해요. SIGCONT를 받으면 얼어붙은 바로 그 명령어부터 이어서 실행하고, 서버는 시간이 지났다는 사실을 모르는 채 계속해요.

이미 아는 두 상태 사이에 놓고 보면 이래요.

얼린 상태중지실행 중
프로세스있음, 실행만 안 함없음실행
메모리그대로 점유반납점유
게임 포트커널이 쥐고 있고 패킷은 줄 섬닫힘서비스 중
월드 시간멈춤멈춤흐름
복귀몇 초기동 + 월드 로딩

이 두 줄을 안전하게 쓰려면 주변에 세 가지가 더 있어야 해요.

  1. 얼리기 전에 강제 저장. SIGSTOP은 가로채거나 막거나 무시할 수 없어요. 그래서 확실한 대신, 서버에 마무리할 틈을 한 순간도 주지 않아요. 메모리에만 있고 디스크에 안 내려간 건 메모리에 그대로 남아요. 그 상태에서 전원이 나가면 그만큼이 사라져요.
  2. 누군가 네트워크를 지켜봐야 해요. 얼어 있는 프로세스는 접속에 응답할 수 없으니 사람이 온 것도 알 수 없어요. 별도의 무언가가 인터페이스에 붙어서 들어오는 패킷을 보고 SIGCONT를 보내 줘야 해요. 게임 서버 옆에서 root로 도는 패킷 스니퍼 한 마리를 두는 셈이에요.
  3. 목록에 남아 있게 해 줘야 해요. 서버가 게임사 백엔드로 보내던 신호도 같이 멈추니까, 얼린 서버는 커뮤니티 서버 목록에서 사라져요. 계속 보이게 하려면 다른 무언가가 그 서버인 척하고 백엔드와 계속 통신해 줘야 해요. 그 서버의 자격 증명과 보내던 내용을 그대로 써서요.

이 중 어느 것도 게임사가 제공하는 기능이 아니에요. 공식 REST API에는 /save, /shutdown, /stop, /announce, 추방과 차단이 있고 일시정지는 없어요(엔드포인트 전체 목록). 위의 것들은 전부 게임 바깥에서, 그런 일이 벌어지는 줄 모르는 게임에 대고 하는 일이고, 게임 업데이트 한 번에 세 단계 중 어디든 발밑이 바뀔 수 있어요.

집에 둔 기기라면 합리적인 거래예요. 거기서는 전기요금이 목적이니까요. 하지만 남이 운영해 주는 서버에서는, 다른 방법으로도 얻을 수 있는 결과를 위해 위의 세 가지와 그 고장 방식까지 같이 사는 셈이에요.

더 단순한 방법: 그냥 끄기

"일시정지"로 사람들이 원하는 건 거의 언제나 우리가 안 할 때 월드도 안 돌아갔으면이에요. 서버를 끄면 그게 그대로 돼요. 장치가 하나도 필요 없어요. 월드는 디스크로 내려가고, 실행되는 게 없으니 게임 속 시간도 흐를 수가 없고, 다시 켜면 그 세이브에서 이어서 시작해요.

안전하게 끄는 순서는 예약 재시작에서 쓰는 것과 같아요.

PW='a-long-password'
API='http://127.0.0.1:8212/v1/api'
# 1. 아직 접속해 있는 사람에게 카운트다운으로 예고
curl -s -u "admin:$PW" -X POST "$API/announce" \
     -H 'Content-Type: application/json' \
     -d '{"message":"60초 뒤 서버를 내립니다. 안전한 곳으로 이동하세요"}'
# 2. 월드를 디스크로 강제 저장
curl -s -u "admin:$PW" -X POST "$API/save"
# 3. 60초 카운트다운 후 정상 종료
curl -s -u "admin:$PW" -X POST "$API/shutdown" \
     -H 'Content-Type: application/json' \
     -d '{"waittime":60,"message":"60초 뒤 서버를 내립니다"}'

저장을 종료보다 먼저 두는 건 공식 문서가 종료 시 저장 여부를 명시하지 않기 때문이에요. 같은 순서가 REST API 가이드예약 재시작 레시피에도 있어요.

대가는 이거고, 숨길 것도 없어요. 다시 올라오는 데 기동과 월드 로딩만큼 걸려요. 1초가 아니에요. 저녁에 모여서 하는 팀이면 먼저 온 사람이 켜 두고 물 한 잔 떠 오면 돼요. 예고 없이 아무 때나 들어오는 서버라면, 그 1분이 바로 얼리는 방식을 택할 이유예요.

끄는 쪽을 자동화하기

손으로 끄는 건 저녁에 모이는 팀이면 충분해요. 알아서 돌게 하고 싶다면 자동화할 부분은 끄는 쪽이지 얼리는 쪽이 아니에요. 서버에 몇 명 있는지 물어보고 그 답에 따라 움직이는 타이머면 돼요. systemd 타이머나 cron으로 5분마다 돌려요.

#!/bin/bash
set -o pipefail
PW='a-long-password'
API='http://127.0.0.1:8212/v1/api'
STATE=/var/lib/palworld-empty-rounds
MAX=6   # 6회 x 5분 = 30분 무인

n=$(curl -sf -u "admin:$PW" "$API/metrics" | jq -r '.currentplayernum') || exit 0
case "$n" in ''|*[!0-9]*) exit 0 ;; esac   # 숫자가 아니면 아무것도 하지 않음
[ "$n" -gt 0 ] && { rm -f "$STATE"; exit 0; }

rounds=$(( $(cat "$STATE" 2>/dev/null || echo 0) + 1 ))
echo "$rounds" > "$STATE"
[ "$rounds" -lt "$MAX" ] && exit 0

curl -s -u "admin:$PW" -X POST "$API/save"
curl -s -u "admin:$PW" -X POST "$API/shutdown" \
     -H 'Content-Type: application/json' \
     -d '{"waittime":10,"message":"접속자가 없어 서버를 내립니다"}'
rm -f "$STATE"

두 군데가 값을 하는데, 첫째가 바로 함정이에요. 조회 실패는 빈 서버가 아니에요. 그런데 파이프는 curl이 아니라 jq의 종료 코드를 돌려주고, jq는 죽은 엔드포인트에 null이라고 답하고는 멀쩡히 끝나요. pipefail과 숫자 검사가 없으면 그 null이 "0보다 크지 않다"가 되고, 포트가 한 번 딸꾹한 것 때문에 열 명 있는 서버가 내려가요. 둘째는 카운터를 sleep 루프가 아니라 파일에 둔 것이고, 그래서 재부팅이 세다 만 카운트를 남기지 않아요.

어려운 절반은 이 스크립트에 없어요. 다시 켜는 쪽이에요. 여기 있는 어떤 것도 서버를 다시 띄우지 못해요. 꺼진 머신에는 요청을 들을 것이 없으니까요. 선택지는 트래픽을 지켜보는 다른 머신, 그 머신에 셸을 가진 봇, 아니면 누군가 systemctl start를 치는 것이에요. 끄는 건 cron 한 줄이고 켜는 건 판단이라는 이 비대칭이, 얼리는 방식이 존재하는 이유이자 그 방식이 root 권한 패킷 스니퍼를 돌려야 하는 이유예요.

둘 다 필요 없을 수도 있어요

거슬리는 게 "월드가 돌아간 것" 전체가 아니라 그중 일부라면, 설정 파일에서 바로 건드릴 수 있어요. 일시정지와 달리 이건 플레이하는 동안에도 적용돼요.

설정무엇이 바뀌나
PalStomachDecreaceRate팰이 배고파지는 속도. 낮춰 두면 하룻밤 비워도 먹이 상자가 비지 않아요(철자가 틀린 건 게임 쪽이에요)
bEnableInvaderEnemy거점 습격 이벤트. 끄면 아무도 못 지키는 거점에 습격이 오지 않아요
WorkSpeedRate거점 팰의 작업 속도. "없는 사이에 진행이 너무 많이 됐다"의 나머지 절반이에요

기본값과 성능을 깎는 항목까지 전부 팰월드 서버 설정 전체 정리에 있어요.

자주 묻는 질문

접속자가 없어도 팰월드 서버는 월드를 계속 돌리나요?

네. 전용 서버는 접속자가 있든 없든 월드를 계산해서, 아무도 없는 서버에서도 팰은 계속 먹고 작물은 자라고 습격도 와요. 그걸 멈추는 방법은 프로세스를 얼리거나 서버를 끄는 것뿐이에요.

자동 일시정지는 팰월드에 내장된 기능인가요?

아니에요. 전용 서버에는 일시정지 명령이 없고 공식 REST API에도 해당 엔드포인트가 없어요. 자동 일시정지라는 이름으로 파는 건 전부 게임 바깥에서 하는 일이에요. 운영체제 시그널로 프로세스를 얼리거나, 서버를 끄고 필요할 때 다시 켜거나 둘 중 하나예요.

접속자가 없으면 팰월드 서버가 알아서 꺼지게 할 수 있나요?

네. /metrics로 접속 인원을 확인하고, 빈 채로 정해진 횟수가 지나면 /save/shutdown을 부르는 타이머면 열다섯 줄쯤으로 돼요. 다시 켜는 쪽은 같은 방식으로 자동화할 수 없어요. 꺼진 서버에는 요청을 들을 것이 없으니까요.

팰월드 서버를 끄면 진행 상황이 날아가나요?

먼저 저장했다면 안 날아가요. 카운트다운으로 예고하고 POST /save를 한 다음 종료하면 디스크의 월드가 최신이고, 다시 켜면 거기서 이어져요. 진행이 날아가는 건 기록 도중에 프로세스가 끊길 때예요. 정전이나, 저장 없이 /stop을 때리는 경우가 그래요.

서버를 멈추면 팰이 굶지 않나요?

멈춰 있는 동안은 그래요. 배고픔을 포함해 월드의 어떤 것도 진행하지 않아요. 다만 플레이하는 시간에 대해서는 아무것도 바꾸지 않아요. 돌아올 때마다 먹이 상자가 비어 있는 게 문제라면 PalStomachDecreaceRate 쪽이 아무것도 멈추지 않고 해결해요.

호스팅에서는 이게 어디에 있나

KeepWorlds팰월드 전용 서버에서 서버를 끄고 켜는 건 콘솔의 내 서버 상세 페이지에 있는 버튼 하나예요. 그 버튼 뒤에서 일어나는 게 위에 쓴 예고 → 저장 → 종료 순서예요. 게임 안에 서버 공지가 먼저 뜨고, 카운트다운이 끝나면 강제 저장을 하고, 그다음에 조용해져요. 이게 정상 종료고, "그냥 끄면 된다"를 도박이 아니라 습관으로 만들어 주는 부분이에요.

옆에 두 가지가 더 있어요. 백업이 주기적으로 돌고 최근 것들이 남아 있어서(완전한 백업에 들어가는 것), 끄던 순간의 상태는 종료가 잘못됐더라도 되돌릴 수 있어요. 그리고 매일 예약 재시작이 같은 페이지의 스위치와 시각으로 있어요. 오래 켜 둔 서버에 쌓이는 메모리 쪽 이야기는 예약 재시작에 있어요.

콘솔의 백업 기록. 끄던 순간의 상태가 그대로 남아 있어요

여기에 없는 건 자동 유휴 종료예요. 접속 인원을 지켜보다가 대신 꺼 주는 장치는 없어요. 누군가 버튼을 눌러야 해요. 금요일과 토요일에 모이는 팀이라면 일주일에 두 번 누르는 대신, 그사이 월드는 나이를 먹지 않아요. 반대로 아예 내리고 싶지 않다면, 계속 띄워 두는 세 가지 장치는 팰월드 서버 24시간 운영에 정리해 뒀어요.

다른 언어로 보기

직접 운영하지 않아도 돼요

게임과 요금제만 고르면 전용 머신에 서버가 올라가요. 백업과 게임 업데이트, 기한 알림은 저희가 챙길게요.

요금제 보기