お金をかけずにサーバーの勉強をしよう

Windows起動時にサーバーアプリを開始する

2023年6月21日

メニューへ戻る

お手製サーバープログラムなどインストーラーを介さないものを Windows起動時に開始させましょう。

Mattermostインストール(Windows)」で、Mattermostのサーバー環境を作ったのは良いのですが、格好良いインストーラーで組み込まれたものではないため、サーバー起動時に自動起動しません。

これを自動起動するようにします。

別に Mattermostに限った手順ではなく、他のものにも応用可能です。

手っ取り早いもので 2通りありますので、それぞれでやってみます。

環境は Windows Server 2022ですけど、他の Windowsでも同じです。


1.タスクスケジューラのサーバー起動時実行スケジュールを使う

タスクスケジューラというのは、特定の日時に自動で色々な作業をさせることができる機能で、無人運転するのが基本のサーバーではよく使っています。

タスクスケジュール設定に「サーバー起動時」が選択できますので、これを使えばよいわけです。

やってみましょう。


スタートメニューから、[Windows 管理ツール] → [Windows タスクスケジューラ] を選択します。


個々のタスクは左側の枠にあるフォルダ階層(木構造)で管理されています。
Windowsをインストールしたままだと Microsoftがデフォルトで設定しているタスクしかありません。
Windows タスクスケジューラ 1

Microsoft作成のタスクとは別に管理した方が良いので、[タスク スケジューラライブラリ]フォルダの下に自前のフォルダを作ります。
[タスク スケジューラライブラリ]フォルダで右クリックして出てくるメニューから [新しいフォルダー] を選択します。
[test] というフォルダを作りました。
Windows タスクスケジューラ 2

作成した [test]フォルダで右クリックして出てくるメニューから [タスクの作成] を選択します。
Windows タスクスケジューラ 3

タスクの設定をします。

[全般]タグです。
[名前]: Mattermost
[セキュリティオプション]: [ユーザーがログオンしているかどうかにかかわらず実行する]を選択
[構成]: [Windows2022]を選択 (余り意味がないらしい)
かつ、[タスクの実行時に使うユーザーアカウント] が [Administrator]ユーザーになっているのでこれを変えます。
ユーザーまたはグループの変更を押します。
Windows タスクスケジューラ 4

[選択するオブジェクト名を入力して下さい] に [SYSTEM]ユーザーを入力し、OKを押します。
Windows タスクスケジューラ 5

※タスクには実行ユーザーのパスワードが埋め込まれているのですが、実行ユーザーのパスワード変更と連動していないのです。
結果としてパスワード変更後からタスク実行が失敗してしまうので、パスワード変更の運用に「タスクのパスワードも再設定する」作業を追加していました。
しかしタスクが多くなってくるととてもやっていられないので、パスワードを持たない OSビルトインの [SYSTEM]ユーザーを使ったりしますが、コイツは Administratorと同じ権限を持っている強いユーザーなのでセキュリティに問題が出るというデメリットがあります。
このサイトでは安易に [SYSTEM]ユーザーや [Administraotr]ユーザーでサーバープロダクトを実行していますが、本来ここの設計は慎重であるべきです。

こうなりました。
Windows タスクスケジューラ 6

[トリガー]タグです。
実行スケジュールを決めます。
新規を押します。
Windows タスクスケジューラ 7

[タスクの開始]: [スタートアップ時]
OKを押します。
Windows タスクスケジューラ 8

こうなりました。 Windows タスクスケジューラ 9

[操作]タグです。
実行するプログラムを決めます。
新規を押します。
Windows タスクスケジューラ 10

[操作]: [プログラムの開始]
[プログラム/スクリプト]: [C:¥work¥mattermost¥bin¥mattermost.exe]
[引数の追加]: [server] OKを押します。
Windows タスクスケジューラ 11

結果として実行するコマンド行がこういう風になりました。
OKを押します。
Windows タスクスケジューラ 12

真ん中の上の枠に今作ったタスクが表示されています。
Windows タスクスケジューラ 13

タスクの設定はこれで完了です。
この後、Windows Serverを再起動して、Mattermostが動き出したことを確認できました。


タスクのデメリットとしては「実行するだけ」の機能に過ぎないということです。

例えば Mattermostは PostgreSQLが動いていることが前提になっているんですが、その関係なんかはタスクでは考慮されていません。

タスクでも事足りはしますが、次の方法が好まれる理由です。


2.scコマンドでサービスとして登録する

商用のサーバープログラムやインストーラ付きのサーバープロダクトの場合は、まずこちらが使われています。

但し、実行プログラム自体をサービスとして動くように作らないといけないはずなので、Mattermostを例にしていますけど、上手く動くかどうかは不明です。
設定の仕方は参考になると思いますので、失敗するような気がしますがやってみます。

スタートメニューから [Windows 管理ツール] → [サービス] を選択します。

この画面に登録されている「サービス」は、サービスの起動・停止・再起動の管理、他サービスへの依存関係閲覧などができます。
Windows サービス 1

ここに登録をするには黒い画面で scコマンドというのを使います。

黒い画面を立ち上げましょう。
スタートメニューから [Windows システムツール] → [コマンド プロンプト] を選択します。

[sc create]コマンドで、[Mattermost]という名前のサービスを登録します。
PostgreSQLへの依存も設定しています。

C:\Users\Administrator> sc create Mattermost binPath= "C:\work\mattermost\bin\mattermost.exe server" DisplayName= "Mattermost" Depend= "postgresql-x64-15"
[SC] CreateService SUCCESS

サービス登録できました。

メニューから [操作] → [最新の情報に更新] を選択します。
Windows サービス 2

そうすると上で作った [Mattermost]サービスの行がでてきますので、右クリックして出てくるメニューから [プロパティ]を選択します。
Windows サービス 3

[全般]タグです。
[スタートアップの種類]: [自動]
Windows サービス 4

[ログオン]タグです。
何も変えてません。
このままにすると実行ユーザー列が [Local System]になりますんで、[SYSTEM]で動くのでしょう。
Windows サービス 5

[回復]タグです。
何も変えてません。
Windows サービス 6

[依存関係]タグです。
PostgreSQLのサービスへの依存が表示されています。
OKを押します。
Windows サービス 7

Mattermostをサービスとして実行できるか試してみます。
[Mattermost]サービスの行で右クリックして出てくるメニューから、[開始] を選択します。 Windows サービス 8

待ちます。
Windows サービス 9

アウトでした。
Windows サービス 10

Mattermostは Windowsサービスには対応してないのかなぁ…。
残念です。

まぁサービス登録されるソフトはほぼインストーラがありますからね。



というわけで、Windows起動時にサーバープログラムを実行する方法でした。

何かの足しになれば幸いです。