Linux用の専用ソースサーバーの構成、パート3


MetaModおよびSourceModをインストールします


サーバーの共同共存をセットアップするプロセス、つまりMetaModとSourceModを追加するプロセスに新しいストリームを導入するときが来ました。


MetaModのインストール:ソース


まず、MetaMod:Sourceプラグインをインストールします。これは、ゲーム機能を追加せず、ソースエンジン、ゲーム、および他のプラグイン間のインターフェースのみを提供します。


ホームページ-http ://www.metamodsource.net/


最新バージョンをダウンロードして、アーカイブを解凍します。


$ wget http://cdn.probablyaserver.com/sourcemod/mmsource-1.10.6-linux.tar.gz $ tar -xvzf mmsource-1.10.6-linux.tar.gz -C ~/tf2/tf 

アドオンサブディレクトリは〜/ tf2 / tfディレクトリ(他のmodをインストールします)に作成され、その中に、Team Fortress 2を含むさまざまなソースゲーム用の多数のファイルを含むmetamodディレクトリが作成されます。


  addons/ addons/metamod.vdf ... addons/metamod/bin/metamod.2.tf2.so addons/metamod/bin/server.so ... addons/metamod/metaplugins.ini 

srcdsゲームサーバーは、起動時に〜/ tf2 / tf / addonsディレクトリの存在を確認し、その中の* .vdfファイルを探します。プラグインライブラリへのパスは、「file」パラメーターで指定する必要があります。 この場合、そのようなファイル〜/ tf2 / tf / addons / metamod.vdfで、MetaMod:Sourceプラグインは「addons / metamod / bin / server」として接続されます(パスは〜/ tf2 / tf /に対して相対的に指定されます)。


次に、SourceModをインストールし、MetaModに接続します。


SourceModをインストールする


ホームページ-http ://www.sourcemod.net/


http://www.sourcemod.net/downloads.php?branch=stableにアクセスして 、Linuxの最新バージョンをダウンロードし、アーカイブを解凍します。


  $ wget https://sm.alliedmods.net/smdrop/1.8/sourcemod-1.8.0-git5947-linux.tar.gz $ tar -xvzf sourcemod-1.8.0-git5947-linux.tar.gz -C ~/tf2/tf 

sourcemodディレクトリは〜/ tf2 / tf / addonsにあり、設定ファイルを含むsourcemodディレクトリは〜/ tf2 / tf / cfg /にありました
〜/ tf2 / tf / addons / metamod-sourcemod.vdfファイル。


  addons/metamod/sourcemod.vdf addons/sourcemod/ addons/sourcemod/scripting/ addons/sourcemod/configs/core.cfg ... cfg/sourcemod/sm_warmode_off.cfg cfg/sourcemod/sm_warmode_on.cfg cfg/sourcemod/sourcemod.cfg 

SourceModの1つのインストールで複数のサーバーを同時に処理することはできないため、サーバーの数だけ複製する必要があります。 アドオンディレクトリで、sourcemodの名前をsourcemod1に変更し、すべてのコンテンツをsourcemod2にコピーします。以前は、便宜上、構成ファイルに対してdos2unixを実行します。


  $ mv ~/tf2/tf/addons/sourcemod ~/tf2/tf/addons/sourcemod1 $ cd ~/tf2/tf/addons/sourcemod1/configs $ dos2unix *.cfg *.ini *.txt $ cp -r ~/tf2/tf/addons/sourcemod1 ~/tf2/tf/addons/sourcemod2 

MetaModは、addons / metamod / sourcemod.vdfファイルのおかげでSourceModを見つけて接続します。 ただし、このファイルは1つであり、サーバーごとに2つの異なるファイルが必要です。 MetaModには、ディレクトリではなくファイル(!)を指すパラメーターがあるため、2つのディレクトリcfg1とcfg2を作成し、そこにsourcemod.vdfを配置して編集します。


  $ mkdir ~/tf2/tf/addons/metamod/cfg{1,2} $ dos2unix ~/tf2/tf/addons/metamod/sourcemod.vdf $ mv ~/tf2/tf/addons/metamod/sourcemod.vdf ~/tf2/tf/addons/metamod/cfg1/sourcemod.vdf $ cp ~/tf2/tf/addons/metamod/cfg1/sourcemod.vdf ~/tf2/tf/addons/metamod/cfg2/sourcemod.vdf 

これらのファイルを編集して、SourceModインストールへのパスを修正します(〜/ tf2 / tfに関しても):


〜/ tf2 / tf /アドオン/ metamod / cfg1 / sourcemod.vdf:


cfg1 / sourcemod.vdf
 "Metamod Plugin" { "alias" "sourcemod" "file" "addons/sourcemod1/bin/sourcemod_mm" } 

〜/ tf2 / tf /アドオン/ metamod / cfg2 / sourcemod.vdf(修正1-> 2):


cfg2 / sourcemod.vdf
 "Metamod Plugin" { "alias" "sourcemod" "file" "addons/sourcemod2/bin/sourcemod_mm" } 

便宜上、設定とログを使用してディレクトリへのシンボリックリンクを作成します。


  $ ln -s ~/tf2/tf/addons/metamod/cfg1 ~/cfg/mm1 $ ln -s ~/tf2/tf/addons/metamod/cfg2 ~/cfg/mm2 $ ln -s ~/tf2/tf/addons/sourcemod1/configs ~/cfg/sm1 $ ln -s ~/tf2/tf/addons/sourcemod2/configs ~/cfg/sm2 $ ln -s ~/tf2/tf/addons/sourcemod1/logs ~/log/sm1 $ ln -s ~/tf2/tf/addons/sourcemod2/logs ~/log/sm2 

MetaModを起動するために個別のコマンドを登録する必要はありません-ゲームサーバーが自動的に起動しますが、SourceModをダウンロードするためのさまざまなディレクトリを指定する必要があります。


最初のサーバーのファイル〜/ cfg / autoexec1.cfgで、最後に追加します:


autoexec1.cfg
 //... // Load SourceMod instance No 1 mm_basedir addons/metamod/cfg1 

2番目のサーバーの場合、〜/ cfg / autoexec2.cfgは似ていますが、「cfg1」->「cfg2」の代わりに:


autoexec2.cfg
 //... // Load SourceMod instance No 2 mm_basedir addons/metamod/cfg2 

MetaModはSourceModをダウンロードする場所を知っていますが、後者は設定をどこから取得するかを知りません。 各SourceModのパスを書きましょう。 MetaModとは異なり、サーバー起動のコマンドラインで既にパラメーターを指定する必要があります。 autoexec.cfgでもserver.cfgでも機能しません。


起動スクリプトstart1.shおよびstart2.shのCMDLINEで、次を追加します。


start1.sh
 CMDLINE="... +sm_basepath addons/sourcemod1 +sm_corecfgfile addons/sourcemod1/configs/core.cfg \ ... 

これは最初のサーバー用です。 2番目のサーバーについては、「sourcemod1」->「sourcemod2」の代わりにのみ同様です。


start2.sh
 CMDLINE="... +sm_basepath addons/sourcemod2 +sm_corecfgfile addons/sourcemod2/configs/core.cfg \ ... 

core.cfgへのパスはsm_basepathから取得されないため、sm_corecfgfileパラメーターが必要です。


確認するには、最初のゲームサーバーを起動し、完全に起動したらコンソールに入力します(コマンドは山括弧で示されます)。


  >>> meta version Metamod:Source version 1.10.6 Built from: https://github.com/alliedmodders/metamod-source/commit/9fed12f Build ID: 946:9fed12f Loaded As: Valve Server Plugin Compiled on: Sep 12 2015 Plugin interface version: 15:14 SourceHook version: 5:5 http://www.metamodsource.net/ >>> mm_basedir "mm_basedir" = "addons/metamod/cfg1" ( def. "addons/metamod" ) singleplayer - Metamod:Source Base Folder >>> meta list Listing 4 plugins: [01] SourceMod (1.8.0.5907) by AlliedModders LLC [02] TF2 Tools (1.8.0.5907) by AlliedModders LLC [03] SDK Hooks (1.8.0.5907) by AlliedModders LLC [04] SDK Tools (1.8.0.5907) by AlliedModders LLC >>> meta info 1 Plugin 1 is running. Name: "SourceMod" by AlliedModders LLC Version: 1.8.0.5907 Description: Extensible administration and scripting system License: See LICENSE.txt URL: http://www.sourcemod.net/ Details: API 015, Date: Apr 26 2016 File: /home/game/tf2/tf/addons/sourcemod1/bin/sourcemod_mm_i486.so >>> sm_basepath "sm_basepath" = "addons/sourcemod1" ( def. "addons/sourcemod" ) - SourceMod base path (set via command line) >>> sm_corecfgfile "sm_corecfgfile" = "addons/sourcemod1/configs/core.cfg" ( def. "addons/sourcemod/configs/core.cfg" ) - SourceMod core configuration file >>> sm plugins list [SM] Listing 17 plugins: 01 "Admin Menu" (1.8.0.5907) by AlliedModders LLC ... 17 "Player Commands" (1.8.0.5907) by AlliedModders LLC >>> sm exts list [SM] Displaying 9 extensions: [01] Automatic Updater (1.8.0.5907): Updates SourceMod gamedata files ... [09] SQLite (1.8.0.5907): SQLite Driver 

さて、ディレクトリとファイルへのパスはすべて正しく、17個の標準プラグインと9個の拡張機能が実行されています。 後で誰が何をするかを分析しますが、今のところは続けます。


コマンドの入力時に次の形式のエラーが発生した場合:


  >>> meta list Listing 1 plugin: [01] <FAILED> >>> sm_basepath Unknown command "sm_basepath" 

つまり、MetaModはSourceModをロードできませんでした。 問題を調べる必要があります。


MetaMod コンソールコマンド :ソース- コンソールコマンド(SourceMM)


拡張機能はディレクトリにあります〜/ tf2 / tf / addons / sourcemod {1,2} / extensions-TF2だけでなく、ソースエンジンでサポートされているすべてのゲーム用。


コンパイルされたプラグインは〜/ tf2 / tf / addons / sourcemod {1,2} / pluginsディレクトリにあります。 プラグインを無効にする場合は、無効なサブディレクトリに単純に転送できます。 プラグイン自体のソースコードは〜/ tf2 / tf / addons / sourcemod {1,2} / scriptingディレクトリにあります。 コンパイラとスクリプトcompile.shもあります。これは、ソースをコンパイルし、コンパイル済みのサブディレクトリにコンパイル済みのプラグインを配置します。コンパイル済みのサブディレクトリから〜/ tf2 / tf / addons / sourcemod {1.2} / plugins-SourceModを使用できるようになります。


〜/ tf2 / tf / addons / sourcemod {1,2} / configsのcore.cfgファイルを編集して、各サーバーのSourceModを構成できるようになりました。 この例では、デフォルトのパラメーターに満足しています。 このパラメーター「DisableAutoUpdate No」 使用すると、ディレクトリ〜/ tf2 / tf / addons / sourcemod {1,2} / gamedataのSourceModのゲームデータの自動更新が有効になります。


core.cfgで「LogMode」パラメーターを「game」に設定することもできます。その場合、ログは個別のファイルではなく、ゲームサーバーのログに書き込まれます。 「ログ」セクションの詳細


他の構成ファイルは後で分析します。


ただし、もう1つ構成ファイルがあります-〜/ tf2 / tf / cfg / sourcemod / sourcemod.cfg-server.cfgの後のカードの変更ごとに実行され、すべてのSourceModインストールに共通です。 したがって、sourcemod.cfgには両方のサーバーに共通のコマンドのみを残し、個々のコマンドを各サーバーの個別のファイルに転送します。


  $ dos2unix ~/tf2/tf/cfg/sourcemod/sourcemod.cfg $ cp ~/tf2/tf/cfg/sourcemod/sourcemod.cfg ~/cfg/sourcemod_default.cfg $ ln -s ~/tf2/tf/cfg/sourcemod ~/cfg/sm 

〜/ tf2 / tf / cfg / sourcemod / sourcemod.cfgを編集し、伝統的に出力「echo」を追加し、「sm_show_activity」を修正し、通常の日付/時刻出力形式を「sm_datetime_format」に設定します。


sourcemod.cfg
 echo "*** ~/tf2/tf/cfg/sourcemod/sourcemod.cfg" // SourceMod Configuration File // This file is automatically executed by SourceMod every mapchange. // Specifies how admin activity should be relayed to users. sm_show_activity 28 // Default datetime formatting rules when displaying to clients. sm_datetime_format "%d %b %Y - %H:%M:%S" 

それだけです 残りは削除されます。 後で、サーバーに独自のパラメーターを設定する場合、保存された〜/ cfg / sourcemod_default.cfgからそれらを取得し、サーバー構成ファイルで指定できます。 元のsourcemod.cfgですべてをそのままにしておくことができないのはなぜですか? また、サーバー{1,2} .cfgの後のカードの変更ごとに実行されるため、たとえば、サーバー{1,2} .cfgで指定されたバックアップスロットに関する設定は、このファイルのデフォルト値で上書きされます。 そして、サーバーに同じバックアップスロットをさまざまな方法で構成します。


新しいSourceModプラグインをインストールすると、その構成ファイルは〜/ tf2 / tf / cfg / sourcemod /に自動的に作成され、両方のSourceModインストールで共通になります。 実際、すでにfuncommands.smxプラグインの設定ファイルがあります

また、デフォルトでは、SourceModはサーバー(update.sourcemod.net)からゲームサーバーから定期的に更新をダウンロードします。これはログに反映されます。 最初のサーバーの例(〜/ tf2 / tf / addons / sourcemod1 / logs /)、3、4、5行目:


  L 03/21/2014 - 14:52:41: SourceMod log file session started (file "L20140321.log") (Version "1.5.3") L 03/21/2014 - 14:52:41: -------- Mapchange to cp_well -------- L 03/21/2014 - 14:52:56: [UPDATER] Successfully updated gamedata file "sdkhooks.games/engine.csgo.txt" L 03/21/2014 - 14:52:56: [UPDATER] Successfully updated gamedata file "sdktools.games/engine.csgo.txt" L 03/21/2014 - 14:52:56: [UPDATER] Successfully updated gamedata file "sm-cstrike.games/game.csgo.txt" L 03/21/2014 - 14:52:56: [UPDATER] SourceMod has been updated, please reload it or restart your server. L 03/21/2014 - 14:55:26: SourceMod log file session started (file "L20140321.log") (Version "1.5.3") L 03/21/2014 - 14:55:26: -------- Mapchange to cp_well -------- 

SourceModのドキュメント- セットアップ管理 、小さなFAQ


次のTeam Fortress 2の更新は、ゲームとSourceModの脆弱な相互作用を混乱させる可能性があるため、新しいバージョンとビルドを追跡し、定期的に更新することが理にかなっています。


プラグイン設定の説明とプレイヤーとサーバーとのインタラクティブな対話の続きは、「SourceMod Plugins」セクションで説明されていますが、今はサーバー起動のセットアップに移りましょう。


ゲームサーバーの自動起動


私たちのゲームサーバーはすでに自動実行に含まれるのに十分古いです。 System V initを使用するシステムの場合、以前に作成したスタートアップスクリプトをやり直すか、 TF2 Wikiの例を使用できます。 systemdを使用するシステムの場合、同様に、srcds1.serviceとsrcds2.serviceという名前の単純な2つのサービスファイルを作成します。


参考までに、素材を更新するには:すべての追加(Records、SourceMod)の後、フルパッケージの同じ最初のサーバー〜/ start1.shの起動スクリプトは次のようになります。


start1.sh
 #!/bin/sh # #   . #     ,    srcds_run GAMEFOLDER=/home/game/tf2 CMDLINE="+sv_pure 2 -game tf +maxplayers 24 \ -pidfile ${GAMEFOLDER}/tf/srcds1.pid \ -ugcpath ${GAMEFOLDER}/steamapps/workshop1 \ -replay reply1.cfg -replayserverdir server1 \ +exec autoexec1.cfg +servercfgfile server1.cfg \ -port 27015 -steamport 26900 +clientport 27005 +tv_port 27020 -strictportbind \ +sm_basepath addons/sourcemod1 +sm_corecfgfile addons/sourcemod1/configs/core.cfg" #    ${GAMEFOLDER}/srcds_run ${CMDLINE} 

srcds_runスクリプトはすでに使用されているため、引き続き使用します。 quit _restart実行するときは、ゲームサーバーの自動再起動のみを行う必要があり_restart 。 現在、スクリプトは、ゼロ以外の終了コードで異常終了した場合、または自動更新が有効な場合にゼロで終了した場合にのみサーバーを再起動します。


いくつかのオプションがあります。 まず、標準の自動更新を有効にするだけです(「サーバー更新」セクションの「自動」セクション)。 2番目は、異なる名前でスクリプトのコピーを作成し、サーバーの永続的な再起動のためにそれを修正し(元のスクリプトを編集しないでください-アップグレード中に置き換えることができます)、将来使用します。 3番目に、サーバーを自分で更新する場合は、-autoupdateとその2つのサテライトパラメーターを起動コマンドラインに追加することで自動更新を有効にできますが、自動更新スクリプトとして〜/ cfg / tf2_quitなどのファイルを使用します。つまり、実際には、更新はチェックされません。


知識は悲しみを増大させます。 しかし、選択はあなた次第です。 私たちの場合、最初のサーバーについては、構成ファイルでラウンドの終わりの基準をまだ指定していません。2番目のサーバーは一般に非標準のカードであり、無限のラウンドである可能性が高いため、自動実行では3番目のオプション-ダミーの自動更新を使用します。実際の更新は、crontabでupdate.shスクリプトを定期的に起動することにより行われます。 繰り返しますが、とても興味深いです。


したがって、サービスファイル。 便宜上、tmdsターミナルマルチプレクサー(代わりにscreenを使用したいユーザー)を使用し、srcds_runスクリプトを実行します。 コマンドラインパラメーターは、以前使用したスタートアップスクリプトからほとんど変更されずに渡されています。


ゲームサーバーはゲームユーザーに代わって起動されるため、良い方法で、ユーザー環境で〜/ .config / systemd / user /に起動ファイルを作成できます。 ただし、ドキュメントのこのセクションは、ユーザーモードでsystemdを実行できないCentOS 7でテストされているため、ルートとしてサービスファイルを作成します。


ルートとして、最初のサーバー用にファイル/etc/systemd/system/srcds1.serviceを作成します。


srcds1.service
 # /etc/systemd/system/srcds1.service # # Team Fortress 2 Source Dedicated Server [Unit] Description=Team Fortress 2 Source Dedicated Server No 1 After=network.target [Service] User=game Group=game WorkingDirectory=/home/game/Steam Type=oneshot RemainAfterExit=yes PIDFile=/home/game/tf2/tf/srcds1.pid ExecStart=/usr/bin/tmux -L socket1 new-session -d '/home/game/tf2/srcds_run \ +sv_pure 2 -game tf +maxplayers 24 \ -pidfile /home/game/tf2/tf/srcds1.pid \ -ugcpath /home/game/tf2/steamapps/workshop1 \ -replay replay1.cfg -replayserverdir server1 \ +exec autoexec1.cfg +servercfgfile server1.cfg \ -port 27015 -steamport 26900 +clientport 27005 +tv_port 27020 -strictportbind \ -autoupdate -steam_dir /home/game/Steam -steamcmd_script /home/game/cfg/tf2_quit \ +sm_basepath addons/sourcemod1 +sm_corecfgfile addons/sourcemod1/configs/core.cfg' ExecStop=/usr/bin/tmux -L socket1 send-keys "quit" Enter ; /usr/bin/sleep 5s ; /usr/bin/tmux -L socket1 kill-session ExecReload=/usr/bin/tmux -L socket1 send-keys "_restart" Enter ExecStopPost=/usr/bin/rm -f /home/game/tf2/tf/srcds1.pid [Install] WantedBy=multi-user.target 

パラメーターExecStopおよびExecReloadについての簡単な説明。 サーバーを完成させるために、私たちは彼に愛の光線とquitコマンドをコンソールに送り、数秒待って作業を完了し、すべてが再開するまでセッションを破りました。 サーバーを再起動するための同様のメカニズム。 必要に応じて、対応するセクションの更新スクリプトの例のように、今後の再起動に関する警告出力をプレーヤーに追加できます。


srcds1.serviceをsrcds2.serviceにコピーし、tmuxソケットのパス、ポート、および名前を調整します。 保存します。 /etc/systemd/system/srcds2.service:


srcds2.service
 # /etc/systemd/system/srcds2.service # # Team Fortress 2 Source Dedicated Server [Unit] Description=Team Fortress 2 Source Dedicated Server No 2 After=network.target [Service] User=game Group=game WorkingDirectory=/home/game/Steam Type=oneshot RemainAfterExit=yes PIDFile=/home/game/tf2/tf/srcds2.pid ExecStart=/usr/bin/tmux -L socket2 new-session -d '/home/game/tf2/srcds_run \ +sv_pure 2 -game tf +maxplayers 24 \ -pidfile /home/game/tf2/tf/srcds2.pid \ -ugcpath /home/game/tf2/steamapps/workshop2 \ -replay replay2.cfg -replayserverdir server2 \ +exec autoexec2.cfg +servercfgfile server2.cfg \ -port 27016 -steamport 26901 +clientport 27006 +tv_port 27021 -strictportbind \ -autoupdate -steam_dir /home/game/Steam -steamcmd_script /home/game/cfg/tf2_quit \ +sm_basepath addons/sourcemod2 +sm_corecfgfile addons/sourcemod2/configs/core.cfg' ExecStop=/usr/bin/tmux -L socket2 send-keys "quit" Enter ; /usr/bin/sleep 5s ; /usr/bin/tmux -L socket2 kill-session ExecReload=/usr/bin/tmux -L socket2 send-keys "_restart" Enter ExecStopPost=/usr/bin/rm -f /home/game/tf2/tf/srcds2.pid [Install] WantedBy=multi-user.target 

ここでは、それぞれ独自のゲームサーバー用に2つのtmuxのコピーを個別に起動します。 もちろん、1つのtmux内のセッション(tmux new-session -d -s tf1およびtmux new-session -d -s tf2)でうまくいくこともできますが、これは予期しないCtrl-Cが釘付けになったときの壮大な失敗の追加ポイントになりますすべてのサーバーになります。


内容を含むファイル〜/ cfg / tf2_quitを作成することを忘れないでください:


tf2_quit
 quit 

両方の.serviceファイルがrootによってのみ書き込み可能であることを確認し、それを起動してオンにします:


  # systemctl start srcds1 # systemctl start srcds2 # systemctl enable srcds1 # systemctl enable srcds2 

しかし今、私たちは愚かな状況にあります-ゲームサーバーはサーバーの起動時に起動しますが、ゲームユーザーはtmuxセッションでCtrl + Cを使用して「制御」することはできますが、systemctl(start、stop、reload) 、その後に手動で開始します。 不正の修正。


ルートのままで、 visudo実行して、sudoersファイルを調整し、最後に追加します。


sudoers
 Defaults:game !requiretty game ALL= NOPASSWD: /usr/bin/systemctl start srcds1.service, /usr/bin/systemctl start srcds2.service game ALL= NOPASSWD: /usr/bin/systemctl stop srcds1.service, /usr/bin/systemctl stop srcds2.service game ALL= NOPASSWD: /usr/bin/systemctl reload srcds1.service, /usr/bin/systemctl reload srcds2.service game ALL= NOPASSWD: /usr/bin/systemctl status srcds1.service, /usr/bin/systemctl status srcds2.service game ALL= NOPASSWD: /usr/bin/systemctl enable srcds1.service, /usr/bin/systemctl enable srcds2.service game ALL= NOPASSWD: /usr/bin/systemctl disable srcds1.service, /usr/bin/systemctl disable srcds2.service 

ここでは、ゲームユーザーにsudoを介して、パスワード(彼が持っていない)を要求することなく、開始、停止、リロード、ステータスコマンドを実行する機会と、1番目と2番目のサーバーのヒープを無効にして有効にする機会を提供します。 また、パラメータ「Defaults:game!Requiretty」を使用すると、crontabファイルからsudoを実行できます。 オプションで、is- *などのコマンドを使用する許可を追加できます。


systemctl edit [--full]という形式のコマンドに対する権限は提供されません。 それでも、セキュリティは...安全でなければなりません。


ルートから抜け出し、ゲームの下からチェックアウトします。


  $ sudo -l 

  Matching Defaults entries for game on this host: ... ..., !requiretty User game may run the following commands on this host: (root) NOPASSWD: /usr/bin/systemctl start srcds1.service, (root) /usr/bin/systemctl start srcds2.service (root) NOPASSWD: /usr/bin/systemctl stop srcds1.service, (root) /usr/bin/systemctl stop srcds2.service (root) NOPASSWD: /usr/bin/systemctl reload srcds1.service, (root) /usr/bin/systemctl reload srcds2.service (root) NOPASSWD: /usr/bin/systemctl status srcds1.service, (root) /usr/bin/systemctl status srcds2.service (root) NOPASSWD: /usr/bin/systemctl enable srcds1.service, (root) /usr/bin/systemctl enable srcds2.service (root) NOPASSWD: /usr/bin/systemctl disable srcds1.service, (root) /usr/bin/systemctl disable srcds2.service 

sudo systemctl status srcds1.servicesudo systemctl status srcds1.serviceすぐに実行できます。


パラメーターを減らすことなくコマンドを入力する必要があります。 つまり、sudo systemctl status srcds1.serviceは正常ですが、sudo systemctl status srcds1はもはやケーキではありません。


systemctlを使用してゲームサーバーを操作するときに「srcds1.serviceの停止に失敗しました:対話型認証が必要です」などのエラーが表示される場合 -それは、sudoを忘れたことを意味します:-)


すべてが機能する場合、tmuxを介して接続し、ゲームユーザーとしてサーバーコンソールを操作できます。


  $ tmux -L socket1 attach $ tmux -L socket2 attach 

tmuxセッションから切断-Ctrl + b、d。


〜/ .bash_profileにエイリアスを書くことができます:


.bash_profile
 alias tf1="tmux -L socket1 attach" alias tf2="tmux -L socket2 attach" 

デフォルトでは、tmuxの保存された履歴のサイズは2,000行ですが、次の形式の〜/ .tmux.confファイルを作成することで、たとえば10,000行に増やすことができます。


.tmux.conf
 set-option -g history-limit 10000 set-option -g set-remain-on-exit on 

2番目のコマンドは、メインプログラムの終了時にtmuxセッションを閉じません。これにより、コンソールで最後の申し訳ありませんが読むことができます。


履歴をナビゲート-Ctrl + b、[、そして通常のキー-Up / Down、PgUp / PgDown。 このモードを終了するのはqです。


ログ


多くの異なるログがあります。 すなわち:


cronログ


cronスクリプトを実行して、更新、統計サーバーHLstatsXを確認し、古いレコードを削除します。その出力は、/ var / log / cronの形式で反映されます


  Jun 15 12:55:01 server CROND[584]: (game) CMD (cd $HOME/stat/scripts && ./run_hlstats start 2 27500 1) Jun 15 12:55:01 server CROND[583]: (game) CMDOUT (HLstatsX:CE daemon control) Jun 15 12:55:01 server CROND[583]: (game) CMDOUT (http://www.hlxce.com) Jun 15 12:55:01 server CROND[583]: (game) CMDOUT (---------------------------) Jun 15 12:55:01 server CROND[583]: (game) CMDOUT (Daemon is already running on port 27500) Jun 15 12:55:01 server CROND[583]: (game) CMDOUT (Daemon is already running on port 27501) ... 

rootユーザー以外は誰も/ var / log / cronを読むことができず、彼は興味がないので、ゲームユーザーに彼のcrontabファイルのログへのアクセスを許可したいと思います。 もちろん、起動行の最後にある各スクリプトは、「... >> $ HOME / log / cron.log」のようなものを追加できますが、これらの「ログ」にはタイムスタンプがなく、実際に手作業です。 より文化的なオプション「... | / usr / bin / logger --tag srcds」は何も変更しません-メッセージは/ var / log / cronにはありませんが、/ var / log / messagesには違いがあります。


したがって、rsyslogデーモンの設定で、ユーザー名「(game)」で始まるcronからのメッセージがゲームユーザーが所有するファイル/home/game/log/cron.logにリダイレクトされ、それ以上処理されないようにします。 (「cron。* / var / log / cron」内)


rsyslogdバージョン8.19をインストールし、/ etc / $IncludeConfig /etc/rsyslog.d/*.conf 、ディレクティブ$IncludeConfig /etc/rsyslog.d/*.confcron.* /var/log/cron前に配置されてcron.* /var/log/cronルールなので、スクリプトからメッセージをインターセプトしますrootユーザーとして、ファイル/etc/rsyslog.d/srcds-10-cron.confに次の内容を追加します。


srcds-10-cron.conf
 # /etc/rsyslog.d/srcds-10-cron.conf if $syslogfacility-text == "cron" and $msg startswith " (game)" then { action( type = "omfile" fileOwner = "game" fileGroup = "game" file = "/home/game/log/cron.log" ) stop } 

omfile , properties .


, ok, .


  # rsyslogd -N 2 # systemctl restart rsyslog 

root, , /etc/logrotate.d/srcds-cron:


srcds-cron
 #/etc/logrotate.d/srcds-cron /home/game/log/cron.log { su game game daily dateext maxage 3 missingok copytruncate compress notifempty } 

私たちはチェックします:


  # logrotate --debug --force /etc/logrotate.d/srcds-cron 

Steam


~/Steam/logs/. , . *.previous.txt , *.previous.txt . , - — , Valve — nobody cares...


-


-, :



/etc/logrotate.d/srcds-nginx, , , Elasticsearch, Kibana Logstash — ELK .


SourceMod


~/tf2/tf/addons/sourcemod{1,2}/logs. ~/tf2/tf/addons/sourcemod{1,2}/configs/core.cfg:


Logging on
/


LogMode daily
— (daily), (map), (game) — .


DebugSpew no


SourceMod , , core.cfg LogMode game , , - :


  L 06/20/2016 - 04:53:24: Executing dedicated server config file server1.cfg L 06/20/2016 - 04:53:32: server_cvar: "sv_tags" "HLstatsX:CE,cp,increased_maxplayers" L 06/20/2016 - 04:53:32: tf_server_identity_account_id not set; not logging into registered account L 06/20/2016 - 04:53:32: server_cvar: "sv_contact" "game@example.org" L 06/20/2016 - 04:53:33: [UPDATER] Successfully updated gamedata file "core.games/common.games.txt" L 06/20/2016 - 04:53:33: [UPDATER] Successfully updated gamedata file "sdkhooks.games/game.doi.txt" L 06/20/2016 - 04:53:33: [UPDATER] Successfully updated gamedata file "sdkhooks.games/master.games.txt" L 06/20/2016 - 04:53:33: [UPDATER] Successfully updated gamedata file "sdktools.games/game.doi.txt" L 06/20/2016 - 04:53:33: [UPDATER] Successfully updated gamedata file "sdktools.games/master.games.txt" L 06/20/2016 - 04:53:33: [UPDATER] SourceMod has been updated, please reload it or restart your server. L 06/20/2016 - 04:53:33: Connection to Steam servers successful. L 06/20/2016 - 04:53:33: Public IP is 192.0.2.0. L 06/20/2016 - 04:53:33: Assigned anonymous gameserver Steam ID [A:1:123456789:1234]. L 06/20/2016 - 04:53:33: VAC secure mode is activated. L 06/20/2016 - 04:53:34: server_cvar: "sm_nextmap" "cp_well" 


~/log/server{1,2}/. , :


log off
(on) . (sv_logfile), (sv_logecho), UDP (logaddress_add).


sv_logfile 1
(1), . sv_logsdir sv_logfilename_format.


sv_logsdir logs
. , ~/tf2/tf/logs, , /home/game/log/server1 /home/game/log/server2 . , , , .


sv_log_onefile 0
(1), (0), : l0618000.log -> l0618001.log -> l0618002.log… l0619000.log -> l0619001.log . : -, l0618000.log -> l0619000.log ; -, - log off log on, , .


sv_logfilecompress 0
, gzip <logfilename>.log.gz . , Linux . , "1" (, sv_log_onefile = "0" ), , .gz , . - — "l" vs "L", Linux:


  ---- Host_Changelevel ---- Compressing /home/game/log/server2/L0713019.log to /home/game/log/server2/L0713019000.log.gz... Success. Removing /home/game/log/server2/L0713019.log. Unable to remove /home/game/log/server2/L0713019.log! Unable to remove /home/game/log/server2/L0713019.log! Server logging data to file /home/game/log/server2/L0713020.log Applying new item schema, version 5C0BC93D 

sv_logfilename_format ""
. "log on". , l<><><000...999>.log , — <Latin Small Letter L> , , . , strftime . , "sv_logfilename_format %Y%m%d" "20160714.log". 20160714.log -> 20160714_000.log -> 20160714_001.log . , , sv_logfilecompress — .


log_verbose_enable 0
(1) . , ( log_verbose_interval) . . , , , . - http://geit.uk/blog/player-flow/ .


log_verbose_interval 3.0
. — 3 .


sv_rcon_log 1
(0), rcon ( -). rcon HLstatsX, , , :


  rcon from "192.0.2.0:60533": command "status" rcon from "192.0.2.0:60533": command "hlx_sm_psay "30" 2 "Round Over - All actions/frags are ignored <...> rcon from "192.0.2.0:60533": command "hlx_sm_psay "30" 1 "Red got 10 points for Round Win"" rcon from "192.0.2.0:60533": command "hlx_sm_psay "30" 1 "Asuka got 2 points (1,025) for Kill Assist"" 

sv_logecho 1
. , (0).


sv_logbans 0
(1) :


  L 07/13/2016 - 23:09:31: Addip: "<><><>" was banned by IP "for 10.00 minutes" by "Console" (IP "10.1.1.1") 

logaddress_add
: , UDP, HLstatsX. 192.0.2.0:27500, — 192.0.2.0:27501


logaddress_del
: .


logaddress_delall


developer 0
. — 0 ( ), 1, 2, 3...


, — , , .


3.5 — 4.0 . , 0.5 — 0.6 .


, logrotate copytruncate , ( , sv_log_onefile 0). copytruncate ( — , sv_logflush 1, , , ) , , , "Binary file (standard input) matches".


, :


  1. . 何もしません。 . .


  2. . "sv_log_onefile 0", "sv_logfilecompress 1" "sv_logfilename_format %Y%m%d", crontab find $HOME/log/server{1,2}/*.gz -type f -mtime +30 -delete , logrotate. , . "" , , — crontab tmux -L socket1 send-keys "changelevel_next" Enter .


  3. アクティブ , - , rsyslog . omfile — File Output Module cron, imfile — Text File Input Module.

. C (- root) /etc/rsyslog.d/srcds-20-chat.conf:


srcds-20-chat.conf
 #/etc/rsyslog.d/srcds-20-chat.conf module(load="imfile" mode="inotify") #   *.log    input( type = "imfile" tag = "srcds1:" file = "/home/game/log/server1/*.log" ruleset = "chat-1" ) # $now -  ,    ,   YYYY-MM-DD template (name="chat1-log-name" type="string" string="/home/game/log/chat1-%$now%.log") #    (say),  (say_team),  steam id  ip ,    ruleset(name = "chat-1") { if ($msg contains [" say ", " say_team ", " connected, address "]) then { action( type = "omfile" fileOwner = "game" fileGroup = "game" dynafile = "chat1-log-name" ) } } 

, :


  Jul 23 10:40:46 server srcds1: L 07/23/2016 - 10:40:27: "Asuka<3><[U:1:12345678]><Blue>" say_team "Valar morghūlis" Jul 23 10:40:46 server srcds1: L 07/23/2016 - 10:40:34: "Rei<4><[U:1:09876543]><Blue>" say "Valar dohaeris, desu" 

rsyslogd — +, (), input, . . ( ommail rsyslog)


, ok, .


  # rsyslogd -N 2 # systemctl restart rsyslog 

, ( file input), , input, rsyslogd. , … .

, :


con_logfile ""
, . , ~/tf2/tf/ ( logs!). ".log", . -consolelog <file> — , — : ~/tf2/bin/<file> , ~/tf2/tf/<file> , ~/tf2/tf/<file>.log .


con_timestamp 0
(1), , . , +con_timestamp 1 -consolelog <file> , .


, , logrotate copytruncate.


, . - , :


  07/15/2016 - 14:59:59: DataTable warning: player: Out-of-range value (72483.898438/65536.000000) in SendPropFloat 'm_flLastDamageTime', clamping. 07/15/2016 - 14:59:59: DataTable warning: player: Out-of-range value (72492.539062/65536.000000) in SendPropFloat 'm_flLastDamageTime', clamping. 07/15/2016 - 14:59:59: DataTable warning: player: Out-of-range value (72479.742188/65536.000000) in SendPropFloat 'm_flLastDamageTime', clamping. 

, ~ 125 , ~ 64 , 1.5 , "" , . , , , , , .


, - root /etc/logrotate.d/srcds-server:


srcds-server
 #/etc/logrotate.d/srcds-server /home/game/log/console*.log { su game game daily dateext rotate 7 copytruncate notifempty missingok compress # compresscmd /home/game/logrotate-filter.sh } 

:


  # logrotate --debug --force /etc/logrotate.d/srcds-server 

— "compresscmd /home/game/logrotate-filter.sh", ~/logrotate-filter.sh :


logrotate-filter.sh
 #!/bin/sh /bin/grep -v ": DataTable warning:" | /bin/gzip -6 

gzip , grep, DataTable warning, gzip, as planned.


, — (sv_logecho 1), (sv_logfile 0) , . :


  07/24/2016 - 18:50:46: DataTable warning: (class info_particle_system): Out-of-range value (-1.000000 / -1.000000) 07/24/2016 - 18:52:21: Attempted to add job to job queue that has already been completed 07/24/2016 - 18:57:11: DataTable warning: (class info_particle_system): Out-of-range value (-1.000000 / -1.000000) 07/24/2016 - 18:57:48: L 07/24/2016 - 18:57:48: "GLaDOS<20><BOT><Red>" triggered "player_builtobject" 07/24/2016 - 18:57:50: L 07/24/2016 - 18:57:50: "Companion Cube<34><BOT><Blue>" killed "GLaDOS<20><BOT><Red>" with "knife" 07/24/2016 - 19:00:24: L 07/24/2016 - 19:00:24: "AimBot<23><BOT><Red>" triggered "domination" against "DeadHead<10><BOT><Blue>" 07/24/2016 - 19:00:25: L 07/24/2016 - 19:00:25: "AimBot<23><BOT><Red>" triggered "killedobject" (object "OBJ_SENTRYGUN") 07/24/2016 - 19:00:32: DataTable warning: info_particle_system: Out-of-range value (1.000000/1.000000) 07/24/2016 - 19:00:49: DataTable warning: (class info_particle_system): Out-of-range value (-1.000000 / -1.000000) 

— . (con_timestamp 0), . rsyslog, ruleset regex . .



HLstatsX , ~/stat/scripts/logs/, , , , , ~/stat/scripts/hlstats.conf "DebugLevel 0"


Steam QuickPlay


( 2 7):


  Setting breakpad minidump AppID = 232250 No account token specified; logging into anonymous game server account. (Use sv_setsteamaccount to login to a persistent account.) ConVarRef room_type doesn't point to an existing ConVar Executing dedicated server config file server1.cfg ... Connection to game coordinator established. tf_server_identity_account_id not set; not logging into registered account *** ~/cfg/server1.cfg ... 

, - Valve "" ( , ...), . — , QuickPlay. もっと詳しく見てみましょう。



, 2014 — hlds_announce , , , . — Counter-Strike: Global Offensive Team Fortress 2, . , . — , , . — Valve, ( CS:GO) , ip , Steam , . — Steam, -. CS:GO, .


. Valve 2014 api http://steamcommunity.com/dev , IGameServersService/CreateAccount . , (XXI ) http://steamcommunity.com/dev/managegameservers , . . :



, , . Steam, (.1 — ok), 5 USD (.2 — ok), (.3 — ok), Team Fortress 2 (.4 — ok). "Do VAC and Game bans apply to all accounts on a phone number?" [ ] ( https://support.steampowered.com/kb_article.php?ref=8625-WRAH-9030 ), , . , Steam Guard :


Game server login token


, https://steamcommunity.com/dev/managegameservers , , , . . .


Create game server login token


, gameserver login token:


New game server login token


~/cfg/autoexec1.cfg:


autoexec1.cfg
 //... // Steam Gameserver Account sv_setsteamaccount 3A820F219B470281C00IDDQD00A4D210 

, ( 2 8):


  Setting breakpad minidump AppID = 232250 Logging into Steam game server account ConVarRef room_type doesn't point to an existing ConVar Executing dedicated server config file server1.cfg ... Connection to Steam servers successful. Public IP is 192.0.2.0. Assigned persistent gameserver Steam ID [G:1:21]. VAC secure mode is activated. 

"Assigned anonymous gameserver Steam ID [A:1:1724597452:5521]" Steam ID — [G:1:21]. "G" — GameServer, "A" — AnonGameServer. — wiki .


Team Fortress 2 , , , , . C:\Program Files\Steam\userdata\< id>\7\remote\ . serverbrowser_hist.vdf, . , ( 9):


  "Favorites" { "4" { "name" "192.0.2.0:27015" "address" "192.0.2.0:27015" "LastPlayed" "1476177442" "appid" "0" "accountid" "21" } } 

accountid , .


, "Regenerate token" , .


:


  Could not establish connection to Steam servers. (Result = 106) enum_names.cpp (136) : Assertion Failed: Missing String for EResult (106) 

, , — , . http://steamcommunity.com/dev/managegameservers , . Steam Web API Key IGameServersService — login_token is_expired.


QuickPlay


UPDATE, : the quickplay system is no longer in use for Team Fortress 2.


quickplay


.


QuickPlay. , https://support.steampowered.com/kb_article.php?ref=2825-AFGJ-3513 . — , , . , , . sv_setsteamaccount , , Steam, , — , . Team Fortress 2, — ~ , cl_gameserver_create_identity. :


  cl_gameserver_create_identity Request to create a game server account sent--please wait. Game server account created successfully! Set these convars on your game server to have it log in and receive benefits: tf_server_identity_account_id 284181 tf_server_identity_token "18a>qPosnHYia?a" 

~/cfg/autoexec1.cfg:


autoexec1.cfg
 //... // QuickPlay tf_server_identity_account_id 284181 tf_server_identity_token "18a>qPosnHYia?a" 

, ( 2, 9, 10):


  Connection to game coordinator established. Received auth challenge; signing into gameserver account... *** ~/cfg/server1.cfg ... Connection to Steam servers successful. Public IP is 192.0.2.0. Assigned persistent gameserver Steam ID [G:1:21]. VAC secure mode is activated. Game server authentication: SUCCESS! Standing: Good. Trend: Steady Successfully logged into gameserver account 284181. For more information about gameserver accounts, visit https://support.steampowered.com/kb_article.php?ref=2825-AFGJ-3513. 

, , .


QuickPlay, autoexec1.cfg . tf_server_identity_disable_quickplay 1.


, Valve, tf_server identity .




Source: https://habr.com/ru/post/J312934/


All Articles