aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Oyun Sunucusu

systemd Servisi: Oyun Sunucusunu Otomatik Başlat

Bir oyun sunucusunu canlı tutmanın en güvenilir yolu, süreci bir systemd servis dosyasıyla yönetmektir. screen ya da nohup ile arka planda başlatılan süreçler sunucu yeniden başlayınca kaybolur, çökünce de kimse ayağa kaldırmaz. systemd ise oyun sürecini açılışta otomatik başlatır, çökerse yeniden çalıştırır ve tüm çıktıyı tek bir yerden okunabilir hale getirir. Bu yazıda bir oyun sürecini sıfırdan systemd servisine dönüştürüyoruz.

Neden systemd servis kullanmalısınız?

Metin2, Minecraft, bir C++ oyun çekirdeği veya kendi yazdığınız bir sunucu binary'si olsun, hepsi uzun süre çalışması gereken arka plan süreçleridir. Bunları doğrudan terminalden başlattığınızda şu sorunlarla karşılaşırsınız:

  • SSH oturumu kapanınca süreç de ölür.
  • Sunucu yeniden başlatıldığında oyun otomatik gelmez.
  • Süreç çökerse manuel müdahale gerekir.
  • Loglar dağınıktır; nerede ne olduğunu takip etmek zordur.

systemd bunların hepsini çözer. Linux dağıtımlarının (Debian, Ubuntu, AlmaLinux, Rocky) varsayılan init sistemidir, ekstra bir araç kurmanıza gerek yoktur.

Servis çalıştıracak ayrı bir kullanıcı oluşturun

Güvenlik açısından oyun sürecini root ile çalıştırmak istemezsiniz. Sürece özel, kabuğu olmayan bir sistem kullanıcısı açın:

sudo useradd --system --create-home --shell /usr/sbin/nologin gameserver
sudo mkdir -p /opt/game
sudo chown -R gameserver:gameserver /opt/game

Oyun dosyalarınızı /opt/game altına yerleştirin. Çalıştırılabilir binary'nin izinlerini kontrol edin: chmod +x /opt/game/start. Bu kullanıcı yalnızca oyunu çalıştırır, sisteme giriş yapamaz; bu da olası bir güvenlik açığının etkisini sınırlar.

systemd servis dosyasını yazma

Servis tanımları /etc/systemd/system/ altında .service uzantılı dosyalarda durur. /etc/systemd/system/gameserver.service dosyasını oluşturun:

[Unit]
Description=Oyun Sunucusu
After=network.target

[Service]
Type=simple
User=gameserver
Group=gameserver
WorkingDirectory=/opt/game
ExecStart=/opt/game/start
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Bölümlerin anlamı:

  • [Unit]After=network.target, ağ hazır olmadan servisin başlamamasını sağlar.
  • Type=simple — Süreç ön planda çalışıyorsa (çoğu oyun sunucusu böyledir) doğru seçimdir. Süreç kendini arka plana atıyorsa Type=forking kullanın.
  • WorkingDirectory — Bazı oyun çekirdekleri yapılandırma dosyalarını çalışma dizinine göreli arar; bunu mutlaka ayarlayın.
  • ExecStart — Çalıştırılacak tam komut. Mutlaka mutlak yol kullanın; systemd PATH beklemez.
  • Restart=on-failure — Süreç sıfırdan farklı bir kodla çıkarsa yeniden başlatır. RestartSec=5 ile yeniden başlatmadan önce 5 saniye bekler.
  • LimitNOFILE — Çok sayıda oyuncu bağlantısı için açık dosya/soket limitini yükseltir.

Servisi etkinleştirme ve başlatma

Dosyayı kaydettikten sonra systemd'ye yeni tanımı okutun, ardından servisi açılışta başlayacak şekilde etkinleştirip çalıştırın:

sudo systemctl daemon-reload
sudo systemctl enable gameserver
sudo systemctl start gameserver

Durumu kontrol edin:

sudo systemctl status gameserver

Çıktıda active (running) görüyorsanız servis çalışıyor demektir. enable komutu servisi multi-user.target'a bağlar; böylece sunucu her açıldığında oyun otomatik gelir. İkisini tek komutta yapmak için systemctl enable --now gameserver kullanabilirsiniz.

Logları journalctl ile izleme

systemd, sürecin standart çıktısını ve hata çıktısını journald içinde toplar. Bu yüzden ayrı bir log dosyası yönetmenize gerek kalmaz:

# Son logları göster
sudo journalctl -u gameserver

# Canlı takip et (tail gibi)
sudo journalctl -u gameserver -f

# Sadece bugünün logları
sudo journalctl -u gameserver --since today

Oyun çekirdeğiniz kendi log dosyalarını yazıyorsa onlar yerinde kalır; journald yalnızca konsola basılan çıktıyı yakalar. Disk dolmasını önlemek için /etc/systemd/journald.conf içinde SystemMaxUse=500M gibi bir sınır koymayı düşünün.

Düzgün durdurma ve sık karşılaşılan hatalar

Birçok oyun sunucusu, kapatılırken oyuncu verisini kaydetmek için yumuşak bir kapanış ister. systemd varsayılan olarak SIGTERM gönderir; sürecinizin bunu yakalayıp temiz kapanması idealdir. Gerekirse bekleme süresini ayarlayın:

[Service]
TimeoutStopSec=30
KillSignal=SIGINT

En sık görülen sorunlar: yanlış yol (ExecStart mutlak olmalı), izin hatası (binary gameserver kullanıcısına ait ve çalıştırılabilir olmalı) ve Type yanlış seçimi (kendini fork eden bir süreçte Type=simple kullanmak servisi sürekli "yeniden başlatıyor" gösterir). Her değişiklikten sonra sudo systemctl daemon-reload çalıştırmayı unutmayın.

Sık Sorulan Sorular

Servisi düzenledikten sonra ne yapmalıyım?

.service dosyasını her değiştirdiğinizde önce sudo systemctl daemon-reload, ardından sudo systemctl restart gameserver çalıştırın. Aksi halde systemd eski tanımı kullanmaya devam eder.

Birden fazla oyun örneği çalıştırabilir miyim?

Evet. Aynı şablonu gameserver@.service adıyla bir şablon birim olarak yazıp systemctl start gameserver@1, gameserver@2 şeklinde örnekler başlatabilirsiniz. Her örnek %i değişkeniyle kendi portunu veya yapılandırmasını alır.

Süreç sürekli yeniden başlıyorsa nedeni nedir?

Genellikle binary hemen çıkış yapıyor demektir. journalctl -u gameserver -f ile gerçek hata mesajını okuyun; çoğu zaman eksik bir yapılandırma dosyası, kullanılamayan bir port veya yanlış çalışma dizini sebep olur.

Sunucu altyapınızı sağlamlaştırmak mı istiyorsunuz? Oyun sunucusu kurulumu, systemd servisleri ve Linux yönetimi konusunda yardıma ihtiyacınız varsa benimle iletişime geçin.

Bu kategorideki tüm yazılar →

Devamı için