Ubuntu 上 Valheim 服务器的自动更新脚本

Ubuntu 上 Valheim 服务器的自动更新脚本

我有一个 Valheim 游戏服务器,在 ubuntu 中以无头服务的形式运行。当适当的用户登录时,它将自动运行。

但是,我遇到了一个小问题。每次客户端游戏更新时,服务器都需要更新,否则它们会被拒绝连接。虽然我已经看到了 sudo crontab 系统本身的更新,但我不知道如何设置服务来更新游戏。目前,我有 3 个最低限度的命令来更新客户端。

  1. sudo systemctl 停止 valheim
  2. /home/用户名/.steam/steamcmd/steamcmd.sh +login anonymous +force_install_dir /home/用户名/Valheim +app_update 896660 验证 +exit
  3. sudo systemctl 停止 valheim

有没有办法创建一个自动运行文件来使用 sudo 密码执行此操作?如果我不在家运行文件,可以远程启动此选项,那就更好了。

答案1

我在我的专用服务器 (Debian 10) 上为我的一个朋友托管了一个 valheim 服务器,遇到了和你一样的问题。我创建了一个 bash 脚本来自动更新服务器。

将此脚本放在您想要的任何文件夹中。我更喜欢将其放在 valheim 目录中。然后更改脚本中的值以与您的环境相对应。

然后执行“chmod +x [脚本路径]”使其可执行。

然后在您的 /etc/crontab 文件中创建一个如下所示的条目(这将每天凌晨 4 点更新服务器(如果您愿意,可以将 4 更改为其他任何内容)。不要忘记使用正确的脚本路径。

0  4    * * *   root    /home/steam/valheim/update_server.sh

脚本(update_valheim.sh)

#!/bin/bash 

# BEGIN - EDIT THOSE LINES TO CORRESPOND TO YOUR ENVIRONMENT    
   
# Where should the update script log to?
LOGNAME="/var/log/valheim-update.log"

# Path of your steamcmd executable
STEAMCMD="/home/steam/steamcmd"

# Start timestamp - don't change this.
STA_TIMESTAMP=`date "+%Y-%m-%d_%H:%M:%S"`

# Installation directory of your dedicated server
VALHEIM_INSTALL_DIRECTORY="/home/steam/valheim"

# Command to run after updating the server
VALHEIM_SERVICE_RESTART="service valheim restart"

# The user to execute the steamcmd with (to not run it as root preventing security issues)
VALHEIM_USER="steam"    

# END - THE REST SHOULDN'T BE EDITED    

printf '\n[*] %s - Updating valheim dedicated server via cronjob...\n\n' $STA_TIMESTAMP >> "$LOGNAME"   

# We prevent permission issues when this script is placed inside the valheim folder as root user. ;) 
chown -R $VALHEIM_USER $VALHEIM_INSTALL_DIRECTORY

su - $VALHEIM_USER -c "$STEAMCMD +login anonymous +force_install_dir $VALHEIM_INSTALL_DIRECTORY +app_update 896660 validate +exit" >> "$LOGNAME" 2>&1   

printf '\n[*] Restarting service...\n\n' >> "$LOGNAME"  

END_TIMESTAMP=`date "+%Y-%m-%d_%H:%M:%S"`   

$VALHEIM_SERVICE_RESTART >> "$LOGNAME" 2>&1 

if [ $? -eq 0 ]; then
        printf '\n[*] Service successfully restarted\n\n%s - Update succeeded\n' $END_TIMESTAMP >> "$LOGNAME"
else
        printf '\n[!] CRITICAL: Error while restarting the service (ERRORLEVEL does not equal ZERO)\n\n%s - Update failed\n' $END_TIMESTAMP >> "$LOGNAME"
fi

来自德国的亲切问候,祝您玩得开心

托马斯

- - 编辑 - -

如果您想让其他人在您不在家时执行该脚本,您可以在您的网络服务器上使用 PHP 脚本(如果有的话),并为 www-data 用户添加 sudo 条目,以便以 root 身份执行该脚本。但不要忘记使用 .htaccess 文件保护相应的链接。

/etc/sudoers

 www-data ALL= NOPASSWD: /home/steam/valheim/update_server.sh

PHP

<?php
set_time_limit(500);
shell_exec("/home/steam/valheim/update_server.sh");

答案2

这不能与 root crontab 一起工作吗?

sudo crontab -e

计划任务:

@hourly echo "yourpassword" | sudo myfile.sh

您的密码将会暴露给任何有权访问该 cron 的人,虽然这不是什么大问题,但请记住这一点。

相关内容