RE:NODE

Valheim სერვერი systemd სერვისად: unit, გადატვირთვა, ლოგები

ავტორი RE:NODE-ის გუნდი
13 წუთის საკითხავი


Linux-ზე Valheim-ის სერვერი systemd-ის ქვეშ უნდა მუშაობდეს: ერთი unit ფაილი /etc/systemd/system/valheim.service-ში, რომელიც სერვერს ცალკე მომხმარებლით უშვებს, ჩატვირთვისას რთავს, ჩავარდნის შემდეგ თავიდან ამუშავებს და - ეს ხაზი ხშირად ავიწყდებათ - KillSignal=SIGINT-ით აჩერებს, რათა გასვლისას სამყარო შეინახოს. დაამატე TimeoutStopSec=120, რომ დიდ სამყაროს ჩაწერის დასრულებისთვის დრო ეყოს, ლოგი journalctl -u valheim-ით წაიკითხე და ყოველკვირეული გადატვირთვისა და ღამის backup-ისთვის cron-ის ნაცვლად systemd timer-ები გამოიყენე. ეს პოსტი unit-ს ხაზ-ხაზ აგებს, განმარტავს, რისგან გიცავს თითოეული პარამეტრი და განიხილავს, რა შეიძლება ცუდად წავიდეს: crash loop, stop, რომელიც kill-ად იქცევა, გაუჩინარებული ლოგები და რამდენიმე სერვერი ერთ მანქანაზე.

ვარაუდია, რომ სერვერი უკვე დაყენებულია SteamCMD-ით, valheim მომხმარებლით, /home/valheim/server-ში, საკუთარი გამშვები სკრიპტით. თუ არა, Valheim სერვერის დაყენება Linux-ზე SteamCMD-ით დაახლოებით თხუთმეტ წუთში მიგიყვანს ამ წერტილამდე, ეს პოსტი კი იქ იწყება, სადაც მისი systemd-ის განყოფილება მთავრდება.

რატომ systemd და არა tmux ან screen#

რამდენიმე თვის განმავლობაში ჩართულ სერვერზე სამი რამ უნდა სრულდებოდეს: ის reboot-ის შემდეგ უნდა ბრუნდებოდეს, ჩავარდნის შემდეგ უნდა ბრუნდებოდეს და მოთხოვნისას სუფთად უნდა ჩერდებოდეს. SSH სესიიდან გაშვებული პროცესი სესიასთან ერთად კვდება. tmux და screen პროცესს გათიშვის შემდეგაც ცოცხლად ინახავენ, ამიტომ ბევრი გზამკვლევი მათ იყენებს, მაგრამ არც ერთი არაფერს რთავს ჩატვირთვისას და არც ერთი ამჩნევს, როცა პროცესი წყდება. სერვერის ჩავარდნის შესახებ მაშინ იგებ, როცა ვინმე გწერს.

systemd სამივეს ფარავს და ისეთ რამეებსაც ამატებს, რასაც ტერმინალის მულტიპლექსერი ვერასდროს მოგცემს:

  • კონტროლირებადი გაჩერება. systemd აგზავნის შენ მიერ არჩეულ სიგნალს, ელოდება იმდენს, რამდენსაც დაუშვებ და მხოლოდ შემდეგ გადადის მკაცრ ზომებზე. სწორი სიგნალით ყოველი დაგეგმილი გაჩერება შენახვიანი გაჩერებაა.
  • ლოგი, რომელშიც ძებნა შეიძლება. სერვერის ყველა გამოტანილი ტექსტი journal-ში მიდის, დროის ნიშნულებით, restart-ებს შორის ინახება და დროისა და შაბლონის მიხედვით ფილტრდება.
  • Restart-ის პოლიტიკა მუხრუჭით. ჩავარდნისას სერვერს თავიდან უშვებს, მაგრამ თუ ის მჭიდრო ციკლში ვარდება, დისკს გატეხილი სამყაროთი არ ტვირთავს.
  • რესურსების ლიმიტები. მეხსიერების ჭერი, CPU-ს წონა და ფაილური სისტემის შეზღუდვები თითო ხაზია.
  • Timer-ები. დაგეგმილი restart-ები და backup-ები, რომლებიც ლოგირდება, ერთ სიაში ჩანს და თავად სერვისზე შეიძლება იყოს დამოკიდებული.

რასაც კარგავ, ინტერაქტიული კონსოლია. Valheim-ის dedicated სერვერი ბრძანებებს მაინც არ კითხულობს standard input-იდან - ადმინისტრატორის ბრძანებებს თამაშის კლიენტის F5 კონსოლში წერს adminlist.txt-ში მყოფი მოთამაშე - ამიტომ ამ თამაშისთვის დანაკარგი თითქმის ნულია. თუ სხვა მიზეზით გინდა მიმაგრებადი კონსოლი, ეს არის მთავარი არგუმენტი LinuxGSM-ის სასარგებლოდ, რომელიც სერვერს tmux-ში უშვებს და საკუთარი ინსტრუმენტებით ამოფარებს.

გამშვები სკრიპტი, რომელსაც unit უშვებს#

systemd-მა სკრიპტი უნდა გაუშვას და არა პირდაპირ binary, რადგან სერვერს ორი environment ცვლადი და სამუშაო დირექტორია სჭირდება. unit-ს ნუ მიუთითებ ჩაშენებულ start_server.sh-ზე; SteamCMD მას ყოველ განახლებაზე და validate-ზე აღადგენს, ამიტომ შენი არგუმენტები მომდევნო patch-თან ერთად გაქრება. შეინახე საკუთარი ასლი:

/home/valheim/server/start_valheim.sh
#!/bin/bashcd "$(dirname "$0")"export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATHexport SteamAppId=892970exec ./valheim_server.x86_64 -nographics -batchmode \    -name "Longship Crew" -port 2456 -world "Midgard" \    -password "herring-barrel-42" -public 1 \    -saveinterval 900 -backups 4

systemd-ისთვის მნიშვნელოვანი დეტალი exec-ია. მის გარეშე სკრიპტი shell პროცესად მუშაობს, სერვერი კი მისი შვილია, და გაჩერებისას systemd-ის გაგზავნილი სიგნალი shell-ს უვარდება. Bash სიგნალებს წინა პლანზე მყოფ შვილ პროცესს ისე არ გადაუგზავნის, როგორც შეიძლება ელოდე, ამიტომ სერვერმა სუფთა გაჩერების სიგნალი შეიძლება საერთოდ ვერ მიიღოს და timeout-ზე მოკვდეს. exec-ით shell თავს valheim_server.x86_64-ით ანაცვლებს, სერვერი სერვისის მთავარი პროცესი ხდება და სიგნალი პირდაპირ მას ხვდება.

ამ ხაზის ყველა არგუმენტი აღწერილია Valheim-ის გაშვების არგუმენტების ცნობარში. ორი მათგანი სერვისისთვის შეგნებულად უნდა აირჩიო: -saveinterval (ნაგულისხმევი 1800 წამი) ზღუდავს, რამდენს დაკარგავ ჩავარდნისას, და -logFile, რომელიც გამოტოვე, თუ ლოგი journal-ში გინდა.

Unit ფაილი ხაზ-ხაზ#

/etc/systemd/system/valheim.service
[Unit]Description=Valheim dedicated serverWants=network-online.targetAfter=network-online.targetStartLimitIntervalSec=600StartLimitBurst=4[Service]Type=simpleUser=valheimGroup=valheimWorkingDirectory=/home/valheim/serverExecStart=/home/valheim/server/start_valheim.shKillSignal=SIGINTTimeoutStopSec=120Restart=on-failureRestartSec=15[Install]WantedBy=multi-user.target
bash
$ sudo systemctl daemon-reload$ sudo systemctl enable --now valheim$ systemctl status valheim

რისთვის არის თითოეული ხაზი:

ხაზირატომ არის იქ
Wants= / After=network-online.targetქსელის ამოსვლის შემდეგ გაეშვას, რომ Steam-ში რეგისტრაცია ჩატვირთვისას არ ჩავარდეს
StartLimitIntervalSec=600, StartLimitBurst=4ათ წუთში ოთხზე მეტი გაშვების შემდეგ systemd ცდას წყვეტს
Type=simpleსკრიპტი წინა პლანზე რჩება; systemd მას პირდაპირ აკონტროლებს
User= / Group=თამაშის სერვერს root-ით არასდროს უშვებ
WorkingDirectory=სკრიპტში ბიბლიოთეკის გზა ინსტალაციის მიმართ ფარდობითია
KillSignal=SIGINTsystemctl stop Ctrl+C-ს ჰგავს, რაც სამყაროს ინახავს
TimeoutStopSec=120რამდენს ელოდება systemd შენახვას, სანამ SIGKILL-ს გაგზავნის
Restart=on-failure, RestartSec=15ჩავარდნის შემდეგ უბრუნდება, წინასწარი პაუზით
WantedBy=multi-user.targetრასაც enable ებმება, რათა ჩატვირთვისას გაეშვას

start-limit პარამეტრები systemd-ის თანამედროვე ვერსიებში [Unit]-შია. უფრო ძველი რელიზები [Service]-ში StartLimitInterval=-ს იღებდნენ; თუ systemctl status უცნობი გასაღების შესახებ გაფრთხილებს, შენს მანქანაზე man systemd.unit-ში ნახე, რომელ დაწერილობას ელოდება.

სუფთა გაჩერება: SIGINT, timeout-ები და შენახვა#

unit-ის ეს ნაწილი წყვეტს, ღირს თუ არა reboot რამეში. Valheim სამყაროს მეხსიერებაში ინახავს და დისკზე ყოველ -saveinterval წამში წერს. სუფთა გამორთვა მას ბოლოჯერ წერს; ნებისმიერი სხვა - არა.

როცა ზემოთ მოცემული unit-ით systemctl stop valheim-ს გაუშვებ, თანმიმდევრობა ასეთია:

  1. systemd აგზავნის SIGINT-ს მთავარ პროცესზე - exec-ის წყალობით ეს სერვერია.
  2. სერვერი ლოგავს, რომ ითიშება, ინახავს სამყაროს და გადის. პატარა სამყაროზე ეს ერთი-ორი წამია; დიდი ბაზებიანი, დიდი ხნის სამყაროზე შესამჩნევად მეტი შეიძლება დასჭირდეს, ნელი დისკები კიდევ უფრო აგრძელებენ.
  3. თუ პროცესი TimeoutStopSec-ის შემდეგაც მუშაობს, systemd აგზავნის SIGKILL-ს და ლოგავს, რომ გაჩერებას დრო ამოეწურა.

სანამ ენდობი, ერთხელ შეგნებულად შეამოწმე:

bash
$ sudo systemctl stop valheim$ journalctl -u valheim -n 40 --no-pager

გამოსვლამდე ბოლო ხაზებში სამყაროს შენახვა უნდა ჩანდეს, systemd-ისგან კი უბრალო Stopped Valheim dedicated server. თუ ამის ნაცვლად State 'stop-sigterm' timed out. Killing. ან Main process exited, code=killed, status=9/KILL ჩანს, სერვერმა დროზე ვერ მოასწრო ან სიგნალი საერთოდ არ მიუღია. შეამოწმე ამ თანმიმდევრობით: არის თუ არა unit-ში KillSignal=SIGINT და გაუშვი თუ არა მის დამატების შემდეგ daemon-reload; იყენებს თუ არა სკრიპტი exec-ს; და ეყოფა თუ არა TimeoutStopSec შენს სამყაროს.

systemctl restart არის stop, რომელსაც start მოსდევს, ამიტომ იგივე სუფთა გაჩერებას იღებს. systemctl kill valheim - არა: ნაგულისხმევად ის unit-ის ყველა პროცესს SIGTERM-ს უგზავნის - არც ბირთვის out-of-memory killer, დენის გათიშვა ან host-ის ჩავარდნა. ამისგან ერთადერთი დაცვა მოკლე შენახვის ინტერვალი და სხვაგან დაცული backup-ებია. Valheim სერვერის backup-ები და სამყაროს დაზიანება გიჩვენებს, როგორ გამოიყურება ნახევრად ჩაწერილი სამყარო და როგორ აღადგინო.

Restart-ის პოლიტიკა და crash loop-ები#

Restart=on-failure სერვერს თავიდან უშვებს, როცა ის არანულოვანი სტატუსით გადის, მოულოდნელი სიგნალით მოკვდება ან დრო ამოეწურება - და systemctl stop-ის შემდეგ არ უბრუნდება, რაც სწორედ გვჭირდება. ალტერნატივები:

პოლიტიკაროდის უბრუნდებაროდის გამოიყენო
noარასდროსყოველი გასვლა ხელით უნდა გამოიძიო
on-failureჩავარდნები, kill-ები, არანულოვანი გასვლებითამაშის სერვერის ჩვეულებრივი არჩევანი
on-abnormalსიგნალები და timeout-ები, არანულოვანი გასვლები - არასერვერი რაიმე მიზეზით განზრახ გადის არანულოვანი კოდით
alwaysყველაფერი, სუფთა გასვლაცაქ იშვიათად სწორია; თამაშში განზრახ გამორთული სერვერი მაშინვე ბრუნდება

RestartSec=15 არის პაუზა თითოეულ restart-მდე. ის ძველ პროცესს UDP პორტების გასათავისუფლებლად დროს აძლევს და crash loop-ს სრული სიჩქარით ტრიალს უშლის.

start limit მუხრუჭია. თუ სამყაროს ფაილი დაზიანებულია ან თამაშის განახლებამ BepInEx მოდი გატეხა, სერვერი ყოველ გაშვებაზე ჩავარდება. ლიმიტის გარეშე systemd მას უსასრულოდ გადატვირთავს, journal-ს ათასობით ერთნაირი შეცდომით ავსებს და პირველ, ყველაზე სასარგებლო ჩანაწერს მარხავს. ათ წუთში StartLimitBurst=4-ით systemd unit-ს failed-ად ნიშნავს და ჩერდება:

bash
$ systemctl status valheim# Active: failed (Result: start-limit-hit)$ journalctl -u valheim -b --no-pager | tail -n 80$ sudo systemctl reset-failed valheim$ sudo systemctl start valheim

რამის reset-მდე ლოგი წაიკითხე. გაშვების ჩვეულებრივ ჩავარდნებს - დაკარგული steamclient.so, დაკავებული პორტი, BepInEx preloader-ის შეცდომა, სამყარო, რომელიც არ იტვირთება - თითოეულს ცნობადი ხაზი აქვს, და Valheim სერვერი გაშვებისას ვარდება მათ ჩამოთვლის.

ლოგები journalctl-ში#

-logFile არგუმენტის გარეშე სერვერი standard output-ზე წერს, systemd მას იჭერს და journal სერვერის ლოგი ხდება. ბრძანებები, რომლებსაც რეალურად გამოიყენებ:

bash
# follow the log live$ journalctl -u valheim -f# everything since the current boot$ journalctl -u valheim -b# a time window$ journalctl -u valheim --since "2026-10-14 19:00" --until "2026-10-14 23:00"# search: connections, the join code, errors$ journalctl -u valheim -g "Got connection|join code|Exception"# the last 200 lines without the pager$ journalctl -u valheim -n 200 --no-pager

Valheim-ის ლოგი ბევრს წერს, ზოგ დისტრიბუტივზე კი journal მხოლოდ მეხსიერებაშია და reboot-ზე ქრება. თუ /var/log/journal არ არსებობს, /etc/systemd/journald.conf-ში დააყენე Storage=persistent და გადატვირთე systemd-journald. journal-ის უსასრულო ზრდის თავიდან ასაცილებლად იმავე ფაილში დააყენე SystemMaxUse= - ერთი თამაშის სერვერისთვის 500M სავსებით საკმარისია - ან მიმდინარე მოცულობა journalctl --disk-usage-ით ნახე.

მეორე არჩევანი ფაილია: დაამატე -logFile /home/valheim/valheim.log გამშვებ ხაზს და სერვერი journal-ის ნაცვლად იქ დაიწყებს წერას. ეს მათ ერგებათ, ვისაც უბრალო ფაილზე tail და grep უყვარს, მაგრამ მაშინ rotation შენი საქმეა, logrotate-ით და copytruncate-ით, რადგან სერვერი ფაილს ღია ინახავს. აირჩიე ერთი; ლოგის ორად გაყოფა ყოველ გამოძიებას ართულებს. რას ნიშნავს ხაზები - გაშვება, join code, კავშირები, შეცდომები, რომლებზეც რეაგირება ღირს - აღწერილია Valheim სერვერის ლოგის ფაილის განმარტებაში.

განახლებები: ყოველ გაშვებაზე თუ ხელით#

ზემოთ მოცემული unit თამაშს არ ანახლებს. [Service]-ში ერთი დამატებითი ხაზით შეგიძლია ეს მიაღწიო:

ini
ExecStartPre=/usr/games/steamcmd +force_install_dir /home/valheim/server +login anonymous +app_update 896660 +quit

მაშინ ყოველი გაშვება, ყოველი restart და ყოველი ჩატვირთვა ჯერ სერვერის ახალ build-ს ამოწმებს. ეს vanilla სერვერისთვის მოსახერხებელია: როცა Valheim-ის patch გამოდის და მოთამაშეები Incompatible version-ს ხედავენ, systemctl restart valheim პრობლემას აგვარებს.

მოდიფიცირებული სერვერისთვის ეს არასწორი არჩევანია. თამაშის patch ჩვეულებრივ BepInEx მოდებს ტეხავს, სანამ ავტორები არ დაეწევიან, და ავტომატური განახლება ნიშნავს, რომ დილის 5 საათის restart-მა შეიძლება სერვერი crash loop-ში დატოვოს, სანამ ვინმე არ შეამჩნევს. მოდიფიცირებულ სერვერზე ExecStartPre გამოტოვე და განაახლე შეგნებულად: გააჩერე სერვერი, გააკეთე backup, valheim მომხმარებლით ხელით გაუშვი SteamCMD, დარწმუნდი, რომ შენი მოდები განახლებულია, თავიდან გაუშვი. კიდევ ორი მცირე შენიშვნა: განახლების შემოწმება ყოველ გაშვებას SteamCMD-ის დროს უმატებს, და თუ განახლება ჩავარდა - Steam გათიშულია, დისკი სავსეა - ExecStartPre ჩავარდება და სერვერი საერთოდ არ ჩაირთვება. გზის წინ - დაუმატე (ExecStartPre=-/usr/games/steamcmd ...), რომ განახლების ეტაპის ჩავარდნისას სერვერი ძველ build-ზე ჩაირთოს. ჯგუფებისთვის დროის საკითხს Valheim სერვერის განახლება და ვერსიების შეუსაბამობის გასწორება ეხება.

Timer-ები: ყოველკვირეული restart-ები და ღამის backup-ები#

systemd timer-ები იგივეს აკეთებენ, რასაც cron, ოღონდ თამაშის სერვერისთვის ორი უპირატესობით: მათი გაშვებები journal-ში სერვერის საკუთარი გამოტანის გვერდით ლოგირდება, და systemctl list-timers ზუსტად გვიჩვენებს, როდის ამოქმედდება თითოეული. timer ორი ფაილისგან შედგება: .timer, რომელიც ამბობს როდის, და .service, რომელიც ამბობს რას.

ყოველკვირეული restart, ორშაბათს დილაადრიან:

/etc/systemd/system/valheim-restart.service
[Unit]Description=Restart the Valheim server[Service]Type=oneshotExecStart=/usr/bin/systemctl restart valheim.service
/etc/systemd/system/valheim-restart.timer
[Unit]Description=Weekly Valheim restart[Timer]OnCalendar=Mon *-*-* 05:00:00[Install]WantedBy=timers.target

მთელი save დირექტორიის ღამის backup, valheim მომხმარებლით:

/home/valheim/backup_valheim.sh
#!/bin/bashset -euo pipefaildest=/home/valheim/backupsmkdir -p "$dest"tar -czf "$dest/valheim-$(date +%F-%H%M).tar.gz" \    -C /home/valheim/.config/unity3d/IronGate Valheimfind "$dest" -name 'valheim-*.tar.gz' -mtime +14 -delete
/etc/systemd/system/valheim-backup.service
[Unit]Description=Back up Valheim worlds[Service]Type=oneshotUser=valheimExecStart=/home/valheim/backup_valheim.sh
/etc/systemd/system/valheim-backup.timer
[Unit]Description=Nightly Valheim backup[Timer]OnCalendar=*-*-* 05:10:00Persistent=true[Install]WantedBy=timers.target
bash
$ chmod +x /home/valheim/backup_valheim.sh$ sudo systemctl daemon-reload$ sudo systemctl enable --now valheim-restart.timer valheim-backup.timer$ systemctl list-timers 'valheim*'$ systemd-analyze calendar "Mon *-*-* 05:00:00"

backup ორშაბათობით restart-იდან ათი წუთის შემდეგ ირთვება, ამიტომ იმ დღეებში ის სამყაროს არქივირებს, რომელიც წამების წინ იყო შენახული. სხვა დღეებში ის ცოცხალ სერვერზე მუშაობს, და შენახვის შუაში გადაღებულმა არქივმა ნახევრად ჩაწერილი ფაილი შეიძლება დაიჭიროს. ან timer მიუთითე ყოველდღე restart-ის შემდგომ დროზე, ან სკრიპტს ათქმევინე, რომ Valheim-ის საკუთარი -backups rotation-იდან უახლესი სრული წყვილი გადაიღოს. Persistent=true გამოტოვებულ backup-ს მომდევნო ჩატვირთვისას ასრულებს, თუ მანქანა 05:10-ზე გამორთული იყო; restart timer-ზე ის არ დატოვო, რადგან დაგვიანებით დაწევა სერვერს საღამოს შუაში გადატვირთავდა. გაითვალისწინე, რომ ზემოთ მითითებული save გზა ნაგულისხმევია; თუ -savedir გაქვს, ის დააარქივე - სად ინახავს Valheim თავის ფაილებს ყველა მდებარეობას ჩამოთვლის.

იმავე დისკზე მყოფი backup მხოლოდ ცუდი შენახვისგან გიცავს და სხვა არაფრისგან. არქივები მანქანის გარეთაც გადაიტანე; თამაშის სერვერის backup-ები S3-ზე ერთ გზას გვიჩვენებს. ასევე, vanilla Valheim-ში სერვერის მხრიდან თამაშში broadcast არ არსებობს - არც RCON, არც stdin კონსოლი - ამიტომ restart-ის ფანჯრის შესახებ მოთამაშეებს Discord-ში შეატყობინე და არა თამაშში გაფრთხილებას ელოდე.

ლიმიტები, გამაგრება და ერთზე მეტი სერვერი#

საფუძვლების მუშაობის შემდეგ [Service]-ში რამდენიმე ხაზის დამატება ღირს:

ini
MemoryMax=6GNoNewPrivileges=truePrivateTmp=trueProtectSystem=fullNice=-5

MemoryMax= cgroups-ით დაცული მკაცრი ჭერია: მას რომ მიაღწიოს, ბირთვი სერვერს შეუნახავად კლავს, რაც უკეთესია, ვიდრე მთელი მანქანა swap-ში გაჩერდეს, მაგრამ მაინც ჩავარდნაა. დააყენე ის სერვერის ჩვეულებრივ სამუშაო მოცულობაზე საგრძნობლად მაღლა - Valheim-ის RAM-ის გზამკვლევში რეალისტური ციფრებია - ან ჯერ MemoryHigh= გამოიყენე, რომელიც კლავს კი არა, აჩქარებს. ProtectSystem=full სერვისისთვის /usr-ს, /boot-სა და /etc-ს მხოლოდ წასაკითხად ხდის; ProtectHome= ნუ დაამატებ, რადგან სერვერი და მისი save-ები home დირექტორიაშია. Nice=-5 საერთო მანქანაზე სერვერს სხვა სამუშაოსთან შედარებით ოდნავ პრიორიტეტს აძლევს.

რამდენიმე სამყაროს ერთ მანქანაზე გასაშვებად unit შაბლონად აქციე, valheim@.service, EnvironmentFile=/etc/valheim/%i.env-ით და გამშვები ხაზით, რომელიც ისეთი ცვლადებისგან შედგება, როგორიცაა $NAME, $WORLD, $PORT და $PASSWORD. თითოეულ ინსტანციას თავისი პორტების წყვილი სჭირდება, მინიმუმ ორით დაშორებული (2456, შემდეგ 2458), თავისი სამყაროს სახელი და სასურველია თავისი -savedir. გაუშვი ისინი valheim@main და valheim@test სახელებით. პორტების არითმეტიკა აღწერილია Valheim-ის პორტები 2456-2458 განმარტებაში.

თუ root-ს საერთოდ ვერ იყენებ, იგივე unit მომხმარებლის სერვისადაც მუშაობს ~/.config/systemd/user/-ში, და systemctl --user-ით იმართება. ის logout-ს მხოლოდ მაშინ გადაურჩება, თუ ამ მომხმარებლისთვის lingering ჩართულია (loginctl enable-linger valheim, რაც ერთხელ root-ს მაინც საჭიროებს). unit-ების, დამოკიდებულებებისა და ლიმიტების უფრო ფართო შესავლისთვის, Valheim-ის მიღმა, იხილე systemd სერვისები შენი აპებისთვის.

FAQ#

ინახავს თუ არა Valheim სამყაროს, როცა systemd აჩერებს?

დიახ, თუ unit SIGINT-ს აგზავნის და სიგნალი სერვერის პროცესს აღწევს. ეს ნიშნავს unit-ში KillSignal=SIGINT-ს და გამშვებ სკრიპტში exec-ს. ნაგულისხმევი SIGTERM-ით ან systemd-სა და სერვერს შორის shell-ით შენახვა გარანტირებული არ არის.

რამდენი უნდა იყოს TimeoutStopSec?

საკმარისი შენი ყველაზე დიდი შენახვისთვის პლუს რეზერვი. 120 წამი თითქმის ყველა სამყაროსთვის კომფორტულია. თუ journal-ში გაჩერების timeout და SIGKILL გამოჩნდება, გაზარდე - და დისკი შეამოწმე, რადგან ასეთი ნელი შენახვა ჩვეულებრივ საცავის პრობლემაზე მიუთითებს.

რატომ წერს systemctl start-limit-hit?

სერვერი StartLimitIntervalSec-ის შიგნით StartLimitBurst-ით დაშვებულზე მეტჯერ ჩავარდა, ამიტომ systemd-მა ცდა შეწყვიტა. რეალური შეცდომისთვის წაიკითხე journalctl -u valheim -b, გაასწორე და თავიდან გაშვებამდე გაუშვი systemctl reset-failed valheim.

restart-ებისთვის systemd timer გამოვიყენო თუ cron?

ორივე მუშაობს. timer-ები ყოველ გაშვებას journal-ში ლოგავენ, შემდეგ გაშვებას systemctl list-timers-ში აჩვენებენ და Persistent=true-ით გამოტოვებულს ასწრებენ, რაც backup-ებისთვის სასარგებლოა. თუ დანარჩენ ყველაფერს უკვე cron-ში მართავ, ისიც კარგია; სინტაქსს cron გამოსახულებების განმარტება აღწერს.

შემიძლია systemd-ით სერვერს ბრძანებები ჩავწერო?

არაფრის მომტანად. Valheim-ის dedicated სერვერს stdin კონსოლი არ აქვს და vanilla-ში RCON-იც არ არის. ადმინისტრატორის ბრძანებებს თამაშის კლიენტის F5 კონსოლიდან adminlist.txt-ში მყოფი მოთამაშეები ასრულებენ, და ეს ერთნაირად მუშაობს, როგორც არ უნდა იყოს სერვერი გაშვებული.