我在 Ubuntu 18.04 上有一个 GMod 服务器,当我通过./run_gmod.sh
(作为拥有文件夹/文件的“steam”用户)运行它时,它运行良好,其内容是
#!/bin/sh
/datadrive/srcds/gmod/srcds_run -game garrysmod -console -norestart -strictportbind -port 27015 -tickrate 60 -maxplayers 20 \
+gamemode terrortown +map ttt_minecraft_b5 \
+host_workshop_collection 1413001823 \
+sv_setsteamaccount XXXXXXXXXXXX
但是我想使用 systemctl 将其安装为服务,以便它在服务器(Azure VM)启动时自动启动。我创建了一个文件,/etc/systemd/system/gmod.service
内容如下:
[Unit]
Description=Gmod Server
After=network.target
[Service]
User=steam
WorkingDirectory=/datadrive/srcds/
ExecStart=/datadrive/srcds/gmod/srcds_run -game garrysmod -console -norestart -strictportbind -port 27015 -tickrate 60 -maxplayers 20 +gamemode terrortown +map ttt_minecraft_b5 +host_workshop_collection 1413001823 +sv_setsteamaccount XXXXXXXXXXXX
[Install]
WantedBy=multi-user.target
然而,当我尝试时,systemctl start gmod
收到的日志非常奇怪:
Nov 27 22:54:49 Server1 systemd[1]: Started Gmod Server.
Nov 27 22:54:49 Server1 bash[4025]: Auto detecting CPU
Nov 27 22:54:49 Server1 bash[4025]: Using default binary: ./srcds_linux
Nov 27 22:54:52 Server1 bash[4025]: Setting breakpad minidump AppID = 4000
Nov 27 22:54:52 Server1 bash[4025]: [S_API] SteamAPI_Init(): Loaded 'steamclient.so' OK.
Nov 27 22:54:52 Server1 bash[4025]: Could not find steamerrorreporter binary. Any minidumps will be uploaded in-processapplicationmanager.cpp (3936) : Assertion Failed: CApplicationManager::GetMountVolume: invalid index
Nov 27 22:54:52 Server1 bash[4025]: CAppInfoCacheReadFromDiskThread took 0 milliseconds to initialize
Nov 27 22:54:52 Server1 bash[4025]: Uploading dump (in-process) [proxy '']
Nov 27 22:54:52 Server1 bash[4025]: /tmp/dumps/crash_20201127225452_4.dmp
Nov 27 22:54:52 Server1 bash[4025]: success = no
Nov 27 22:54:52 Server1 bash[4025]: error: libcurl.so: cannot open shared object file: No such file or directory
Nov 27 22:54:52 Server1 bash[4025]: applicationmanager.cpp (3936) : Assertion Failed: CApplicationManager::GetMountVolume: invalid index
Nov 27 22:54:52 Server1 bash[4025]: applicationmanager.cpp (4099) : Assertion Failed: m_vecInstallBaseFolders.Count() > 0
Nov 27 22:54:52 Server1 bash[4025]: CApplicationManagerPopulateThread took 0 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
Nov 27 22:54:52 Server1 bash[4025]: [S_API FAIL] Tried to access Steam interface SteamUser020 before SteamAPI_Init succeeded.
Nov 27 22:54:56 Server1 bash[4025]: applicationmanager.cpp (4099) : Assertion Failed: m_vecInstallBaseFolders.Count() > 0
Nov 27 22:55:00 Server1 bash[4025]: [S_API] SteamAPI_Init(): Loaded 'steamclient.so' OK.
Nov 27 22:55:00 Server1 bash[4025]: CAppInfoCacheReadFromDiskThread took 0 milliseconds to initialize
Nov 27 22:55:00 Server1 bash[4025]: Could not find steamerrorreporter binary. Any minidumps will be uploaded in-processapplicationmanager.cpp (3936) : Assertion Failed: CApplicationManager::GetMountVolume: invalid index
Nov 27 22:55:00 Server1 bash[4025]: Uploading dump (in-process) [proxy '']
Nov 27 22:55:00 Server1 bash[4025]: /tmp/dumps/crash_20201127225500_5.dmp
Nov 27 22:55:00 Server1 bash[4025]: success = no
Nov 27 22:55:00 Server1 bash[4025]: error: libcurl.so: cannot open shared object file: No such file or directory
Nov 27 22:55:00 Server1 bash[4025]: applicationmanager.cpp (3936) : Assertion Failed: CApplicationManager::GetMountVolume: invalid index
Nov 27 22:55:00 Server1 bash[4025]: applicationmanager.cpp (3936) : Assertion Failed: CApplicationManager::GetMountVolume: invalid index
Nov 27 22:55:00 Server1 bash[4025]: applicationmanager.cpp (4099) : Assertion Failed: m_vecInstallBaseFolders.Count() > 0
Nov 27 22:55:00 Server1 bash[4025]: CApplicationManagerPopulateThread took 0 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
Nov 27 22:55:09 Server1 bash[4025]: applicationmanager.cpp (4099) : Assertion Failed: m_vecInstallBaseFolders.Count() > 0
Nov 27 22:55:09 Server1 bash[4025]: httpclient.cpp (4181) : Assertion Failed: Failed writing http cache file to disk
Nov 27 23:00:42 Server1 systemd[1]: gmod.service: Current command vanished from the unit file, execution of the command list won't be resumed.
通过run_gmod.sh
脚本启动时,正常日志如下所示:
Auto detecting CPU
Using default binary: ./srcds_linux
mount.cfg adding path: '/datadrive/srcds/gmod/content/css/cstrike'
Couldn't load shader dll: game_shader_generic_garrysmod_srv.soConVarRef mat_dxlevel doesn't point to an existing ConVar
Game_srv.so loaded for "Garry's Mod"
Setting breakpad minidump AppID = 4000
Initializing Steam libraries for Workshop..
[S_API] SteamAPI_Init(): Loaded 'steamclient.so' OK.
CApplicationManagerPopulateThread took 0 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
CAppInfoCacheReadFromDiskThread took 2 milliseconds to initialize
[S_API FAIL] Tried to access Steam interface SteamUser020 before SteamAPI_Init succeeded.
WS: Waiting for Steam to log us in..
WS: Fetching collection info...
Processing collection 1413001823...
Collection 'TGN Reborn Content'
75 new addons
WS: Finished!
WS: Processing 75 addons...
and then more stuff happens
日志在第二行(Using default binary: ./srcds_linux
)之后就出现了分歧,我不明白为什么运行相同的命令时结果会如此不同,只是方式不同。这是 GMod 特有的问题,还是我的gmod.service
文件不正确?我尝试查找这个问题,但用于将服务器作为服务运行的资源很少,而且.service
我找到的示例文件最终也给出了类似的错误,所以我想我应该从头开始。
答案1
事实证明,使用以下 systemd 服务文件可以使其工作(或多或少):
[Unit]
Description=Gmod Server
After=network.target
[Service]
User=rooday # the user I normally run run_gmod.sh with
ExecStart=/datadrive/srcds/run_gmod.sh
Restart=Always
[Install]
WantedBy=multi-user.target
或多或少是因为使用我的服务器的参数run_gmod.sh
启动(srcds 安装的一部分)脚本,并且该脚本本身在设置一些环境变量后运行实际的服务器二进制文件。所以现在至少我的服务器使用 systemd 成功运行,但只跟踪而不是包含所有重要日志的实际服务器二进制文件。但这超出了这个问题的范围/可以比 gmod 更笼统地表述,所以我认为这个问题已经得到回答了。srcds_run
journalctl
srcds_run