Linuxマシンを任意の時間の間シャットダウンする(ゲームサーバー)

ARK用のサーバーを建てた時に、誰も入っていない昼間にサーバーが動き続けているのは電力の無駄だし、管理が面倒ですよね。 また、ある程度の頻度でアップデートをかける必要があります。

でもいちいち手動でシャットダウン・起動をするのもスマートじゃない。

なので設定した時間の間、サーバーの電源が切れるようにしました。 Linux標準のcronとBIOSの設定だけなので比較的簡単です。

自分がARKように建てたサーバーで行っているのでARKを例にしていますが、Minecraftとか、他のゲームサーバーにも使えると思います。

目次

  1. ARKサーバーシステムの自動起動の確認
  2. 時間を指定してシャットダウンする
  3. 時間を指定してマシンを立ち上げる

1.ARKサーバーシステムの自動起動の確認

まずはcystemdを用いたサーバーの自動設定が正常に起動するか確認しておきます。

マシンの電源が入ったら自動でサーバーが起動することが前提です。

$ sudo shutdown shutdown -h now
(マシンの再起動)
$ sudo systemctl status ark-dedicated.service
● ark-dedicated.service
   Loaded: loaded (/etc/systemd/system/ark-dedicated.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-03-19 14:12:38 JST; 17s ago
  Process: 773 ExecStartPre=/home/username/steam/steamcmd.sh +login anonymous +force_install_dir ark +app_update 376030 +quit (code=exit
 Main PID: 1586 (ShooterGameServ)
    Tasks: 12 (limit: 4915)

私のark用サーバーはこんな感じでリブートかけたらサーバーも起動します。

起動に失敗する場合

設定が正しくできていてもSteamへの接続がうまくいかず、タイムアウトすることが割と頻繁にあります。

$ sudo systemctl status ark-dedicated.service
● ark-dedicated.service
   Loaded: loaded (/etc/systemd/system/ark-dedicated.service; enabled; vendor preset: enabled)
   Active: failed (Result: timeout) since Wed 2020-03-18 18:15:03 JST; 5s ago
  Process: 1677 ExecStartPre=/home/username/steam/steamcmd.sh +login anonymous +force_install_dir ark +app_update 376030 +quit (code=kil

 3月 18 18:13:34 ubuntu-username steamcmd.sh[1677]: Failed to set thread priority: per-thread setup failed
 3月 18 18:13:34 ubuntu-username steamcmd.sh[1677]: OK.
 3月 18 18:14:49 ubuntu-username steamcmd.sh[1677]: Connecting anonymously to Steam Public...Retrying. . .
 3月 18 18:14:49 ubuntu-username steamcmd.sh[1677]: Loaded client id: 8524229496731347362
 3月 18 18:14:49 ubuntu-username steamcmd.sh[1677]: Listening for IPv4 broadcast on: 27036
 3月 18 18:14:49 ubuntu-username steamcmd.sh[1677]: Logged in OK
 3月 18 18:15:03 ubuntu-username systemd[1]: ark-dedicated.service: Start-pre operation timed out. Terminating.
 3月 18 18:15:03 ubuntu-username steamcmd.sh[1677]: Waiting for user info...
 3月 18 18:15:03 ubuntu-username systemd[1]: ark-dedicated.service: Failed with result 'timeout'.
 3月 18 18:15:03 ubuntu-username systemd[1]: Failed to start ark-dedicated.service.

その場合は少し待ってから再実行しましょう。

$ sudo systemctl start ark-dedicated.service

2.時間を指定してシャットダウンする

Linux標準のcronコマンドを使えば時間を指定してシャットダウンすることができます。

cron(crontab)とは、分・時・月・曜日を指定して定期的に実行してくれる機能です。 shutdownコマンドを実行するためにrootになりまして、crontabに追記します。 この時インストールされているエディタからどのエディタで開くか選択できます。私はemacsです。

$ sudo su -
# crontab -e

エディタが開いたら時間とコマンドを書き込んであげれば完了です。

例)毎日12時にシャットダウンするようにするコマンド

0 12 * * * root /sbin/shutdown -h now

crontab内に詳しい書き方がコメントで書いてあるんで参考にしてください。

最後に設定を反映させます。

# /etc/init.d/cron start

追記 30分おきにサーバーがセーブを行うようにしているのですが、セーブ処理中にシャットダウンしないように3分ほど遅らせた方がいいんじゃないかと思い始めました。

3.時間を指定してマシンを立ち上げる

残念ながら完全にOSも電源を切ったシャットダウン状態から回復するコマンドはないと思います。多分。

S4あるいはハイバネーションと呼ばれるほぼシャットダウンのような状態からなら復帰できるんですけど、それだと中途半端です。 せっかくなら前節の通り完全にシャットダウンから復帰させたい。

そこで使えるのがBIOS設定です。大体のBIOSには「指定した時間にマザボに通電してあれば起動を試みる」設定があります。 それを使います。

BIOS画面にて、”APM”となのつく設定を探してみてください。 わからなければ「マザーボードのメーカー名+ BIOS + 自動起動」で検索。 windowsLinuxも一緒です。 時間を指定して電源ボタンを自分で押してもらってるわけですから。

注意して欲しいのは、マザボの時刻はグリニッジ標準時のことが多いです。

おまけ

cronの設定ですが、なぜか稀に失敗することがあるんですよね... ふとみた時に起動したままだったりして悲しくなります。これは私の環境だけなのか、設定がおかしいのか教えて欲しいです。

Steamへの接続が失敗した場合に時間をおいて再起動ってしたいですね。 来週あたり暇ならやります。