XAMPP コンパネを使わない制御 (Windows)

# はじめに
- XAMPP Control Panelは、「Quit」を使用せずにウインドウを閉じると、バックグラウンドプロセスが残ってしまうようです。
- 導入直後はともかく、設定が固まってからは、もう少し簡便に使いたいと考えました。
- この記事では、ApacheとMySQL(MariaDB)だけを扱いますが、他のサーバもほぼ同様です。

#### 環境
- Windows 10 Pro 20H2
- XAMPP 8.0.2
    - Control Panel v3.2.4
    - 導入編 ⇒ [XAMPPとLaravelの導入 (Windows)](https://qiita.com/tetr4lab/items/ec27eed6b59ff89699a8)

# A. プロセスとして使う
- サーバが稼働中であることを分かり易く示したい場合にお勧めの方法です。
- あらかじめ用意されている、起動と終了のバッチファイルを使用します。
- プロセスとして開始すると、プロセスを終了するまでウインドウが残ります。
    - ショートカットを作ればウインドウを最小化しておくこともできます。
    - ウインドウを閉じると、サーバによって、プロセスが強制終了する場合と、バックグラウンドにプロセスが残ってしまう場合があります。
    - プロセスが残ってしまった場合でも、「終了」のバッチを使うことで、正しく終了できます。

## Apache
### 開始
```text
C:\xampp\apache_start.bat
```

### 終了
```text
C:\xampp\apache_stop.bat
```

## MySQL
### 開始
```text
C:\xampp\mysql_start.bat
```

### 終了
```text
C:\xampp\mysql_stop.bat
```

# B. サービスとして使う
- 目立たずひっそりと稼働させたい場合にお勧めの方法です。
- サービスとして導入すると、OSの一部になって、バックグラウンドで動作します。
- あらかじめ用意されている、サービスの導入と削除を行うバッチファイルを使用します。
    - バッチファイルは実行時のディレクトリに依存していますので、実行の際はカレントディレクトリに注意してください。
- 導入されたサービスは、スタートアップが「自動」に設定されています。
    - PC起動時に自動的に開始したくない場合は、「サービス」アプリで「手動」に切り替えてください。
        - 設定アプリは、スタートボタンを押して「サービス」と入力すれば見つかります。
- XAMPPをアンインストールする際は、先だって、導入済みのサービスを全て削除してください。

## Apache
### サービスの導入
```text:コマンドプロンプト&nbsp;(管理者)
C:\WINDOWS\system32>cd \xampp\apache

C:\xampp\apache>apache_installservice.bat
Installing Apache2.4 as an Service
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
Now we Start Apache2.4 :)
Apache2.4 サービスを開始します.
Apache2.4 サービスは正常に開始されました。
```

### サービスの開始と終了
```text:コマンドプロンプト&nbsp;(管理者)
C:\>net start Apache2.4
Apache2.4 サービスを開始します.
Apache2.4 サービスは正常に開始されました。

C:\>net stop Apache2.4
Apache2.4 サービスを停止中です.
Apache2.4 サービスは正常に停止されました。
```

### サービスの削除
```text:コマンドプロンプト&nbsp;(管理者)
C:\xampp\apache>apache_uninstallservice.bat
Are you sure you wan't this?
now stopping Apache2.4 when it runs
Apache2.4 サービスを停止中です.
Apache2.4 サービスは正常に停止されました。

Time to say good bye to Apache2.4 :(
Removing the 'Apache2.4' service
The 'Apache2.4' service has been removed successfully.
```

## MySQL
### サービスの導入
```text:コマンドプロンプト&nbsp;(管理者)
C:\xampp\apache>cd ..\mysql

C:\xampp\mysql>mysql_installservice.bat
Installing MySQL as an Service
指定されたファイルが見つかりません。
Service successfully installed.
Try to start the MySQL deamon as service ...
mysql サービスを開始します.
mysql サービスは正常に開始されました。
```

### サービスの開始と終了
```text:コマンドプロンプト&nbsp;(管理者)
C:\xampp\mysql>net start MySQL
mysql サービスを開始します.
mysql サービスは正常に開始されました。


C:\xampp\mysql>net stop MySQL
mysql サービスを停止中です.
mysql サービスは正常に停止されました。
```

### サービスの削除
```text:コマンドプロンプト&nbsp;(管理者)
C:\xampp\mysql>mysql_uninstallservice.bat
now stopping MySQL when it runs
mysql サービスを停止中です.
mysql サービスは正常に停止されました。

Uninstalling MySql-Service
Service successfully removed.
```

## サービスの開始と終了をショートカットする
- サービスの開始と終了の度に、コマンドプロンプトを開くのは面倒ですね。

### a. ショートカットを作る
- 管理者権限の使用を明示したい場合にお勧めの方法です。
    - ユーザアカウント制御(UAC)のダイアログが出て、管理者への昇格の是非を確認されます。
- 下記のように「リンク先」を指定してショートカットを作ります。
    - 「詳細設定」で、「管理者として実行」にチェックを付けておきます。

#### Apache
```text:開始のリンク先
C:\windows\system32\net.exe start Apache2.4
```

```text:終了のリンク先
C:\windows\system32\net.exe stop Apache2.4
```

#### MySQL
```text:開始のリンク先
C:\windows\system32\net.exe start MySQL
```

```text:終了のリンク先
C:\windows\system32\net.exe stop MySQL
```

### b. UACのダイアログを回避する
- 面倒な操作を極力避けたい場合にお勧めの方法です。
- 以下では、「サービス"Apache2.4"の開始」を例に説明します。
    - 「サービス～の終了」では、「start」⇒「stop」になります。
    - "MySQL"であれば、「Apache2.4」⇒「MySQL」です。

#### タスクを作る
- スタートボタンを押して`タスク`と入力し、`タスク スケジューラ`を起動します。
    - `タスク マネージャー`ではありません。
- タスクスケジューラが開いたら、`操作`から`新しいフォルダ…`を選んで、`Xampp`フォルダを作ります。
    - `タスク スケジューラ ライブラリ`の下にできた`Xampp`を選びます。
- `タスクの作成…`を選んで、タスクを作成します。
    - `全般`タブ
        - `名前`: `Start Apache2.4`
        - `ユーザがログオンしているかどうかにかかわらず実行する`: 選択
            - これを選ぶと、実行時にウインドウが開きません。(ヘッドレス)
        - `最上位の特権で実行する`: オン
            - これによって、UACのダイアログを回避できます。
    - `操作`タブ
        - `新規…`
            - `操作`: `プログラムの開始`
            - `プログラム/スクリプト`: `C:\windows\system32\net.exe`
            - `引数の追加`: `start Apache2.4`
    - `条件`タブ
        - `コンピュータをAC電源で使用している場合のみタスクを開始する`: オフ
            - バッテリ動作時に起動したくない場合は「オン」のままで良いです。
    - `設定`タブ
        - `タスクを停止するまでの時間`: `1 分間`
            - 選択肢にはないけど、テキストとして入力すれば設定できます。
            - 「1」と「分間」の間には半角スペースがあります。
        - `新しいインスタンスを開始しない` ⇒ `既存のインスタンスの停止`
    - 正しく入力できたら`OK`ボタンを押して保存します。
        - ヘッドレスのタスクを保存しようとすると、実行時に使用するアカウントを確認されます。
        - 保存したタスクは後からでも編集可能ですが、場所(フォルダ)と名前は変更できません。

#### ショートカットを作る
- 「リンク先」として、下記のように指定します。
    - これは、タスクスケジューラ`schtasks.exe`に、実行`/run`、タスク名`/tn "Xampp\Start Apache2.4"`を渡しています。
- タスク名に空白文字が含まれるので、二重引用符で囲っています。

```text:リンク先
C:\Windows\System32\schtasks.exe /run /tn "Xampp\Start Apache2.4"
```

- このショートカットは通常の権限で実行可能なので、UACのダイアログは出なくなります。

# 稼働状況の確認
以下のバッチファイルは、サービスとして導入した場合と、プロセスとして使用した場合、双方の稼働状況を確認可能です。

```text:show_status.bat
@echo off
echo XAMPP status
rem Check As Services
sc queryex Apache2.4
sc queryex MySQL
rem Check As Processes
tasklist /FI "IMAGENAME eq httpd.exe"
tasklist /FI "IMAGENAME eq mysqld.exe"
pause
```