systemdを使ってsynergycを自動起動する

# 前提環境
- OSはCentOS7。デスクトップ環境。ターミナルも使用します。
- この記事では Synergy のクライアントをサービスとして自動起動させます。が、他のもの（自作のシェルなど）も同様の方法でサービス化出来ます
<details><summary>Synergyとは</summary>Synergyは異なるPC間でマウスとキーボードを共有できるソフトです。例えばWindowsPCに接続したマウスとキーボードを使って、WindowsPCとCentOSのPCの画面を行き来して操作出来ます。WindowsPCのSynergyは自動起動してくれますが、CentOSでは自動起動してくれないっぽいので、今回systemctlを使って自動起動させます。</details>

# 手順
## 1. サービス（synergyc）起動のコマンドラインを確認する
今回はsynergy（のクライアント）を自動起動するので、synergyをGUIで起動して起動オプションを確認、それをコンソールで実行してsynergyが動作するか確認しました。

デスクトップのアプリケーション→アクセサリ→Synergy で起動。

```
ps -ef|grep synergy
steam     7046     1  0 10:04 ?        00:00:00 synergy
steam     7053  7046  0 10:04 ?        00:00:00 /usr/bin/synergyc -f --no-tray --debug INFO --name DG33FB 192.168.112.20:24800
steam     7062  2868  0 10:04 pts/1    00:00:00 grep --color=auto synergy
```
これでsystemdに登録するコマンドラインがわかりました。
※ちなみに、今回 synergy のクライアントを設定するのでsynergyではなくsynergy"c"を設定します

## 2. 設定ファイルを書く
設定ファイルをunitと言うらしいです。
~~`sudo vi /usr/lib/systemd/system/synergyc.service`~~
`sudo vi /etc/systemd/system/synergyc.service`
を実行し下記を記述します。

```ini
[Unit]
Description = Synergy_client

[Service]
ExecStart=/usr/bin/synergyc -f --no-tray --debug INFO --name DG33FB 192.168.112.20:24800
Restart=always
Type=simple

[Install]
#WantedBy=graphical.target
WantedBy=multi-user.target
```
- 全体的に、=の前後の空白はあってもなくてもよい。
- #でコメントアウト出来るっぽい
- Description ←説明。なんか適当で良い。空白あっても大丈夫
- ExecStart ←起動（自動起動）のコマンド。ここに１．で調べたコマンドを記述する
- Restart ← synergyが落ちた時も自動起動させる。必須ではない（Synergyはそうそう落ちないと思う）が設定しておく。
- Type ←「ユニットプロセスの起動タイプ」だそうです。[詳細](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)
- WantedBy ←multi-user.target で従来のランレベル３、graphical.target でランレベル５で起動するらしい。けど違いはわかりませんでした。
- ファイルのパーミッションは 644

そして、下記コマンドでsystemdに反映させます。

```
systemctl daemon-reload
```
※初回はエラーになるかも？

## 3. 設定確認
自動起動させる前に、ステータス確認、手動起動・停止、自動起動設定・無効設定を行って正常に動作するか確認します。

コマンド一覧

- systemctl status  synergyc.service ←ステータス確認
- systemctl start   synergyc.service ←手動起動
- systemctl stop    synergyc.service ←停止
- systemctl enable  synergyc.service ←自動起動設定
- systemctl disable synergyc.service ←自動起動無効設定

※毎回 synergyc.service と入力するのは大変ですが、synまで入力してTABキーを押すと補完されて楽です。
<details><div>

####ステータス表示確認

```
$ systemctl status synergyc.service
● synergyc.service - Synergy client
   Loaded: loaded (/usr/lib/systemd/system/synergyc.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
```
１つ目の disabled ＝自動起動が無効
inactive (dead) ＝ synergyc 停止

####手動起動

```
systemctl start synergyc.service
```
ステータスを確認します

```
$ systemctl status synergyc.service
● synergyc.service - Synergy client
   Loaded: loaded (/usr/lib/systemd/system/synergyc.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2018-03-14 10:49:48 JST; 7s ago
 Main PID: 2810 (synergyc)
   CGroup: /system.slice/synergyc.service
           └─2810 /usr/bin/synergyc -f --no-tray --debug INFO --name DG33FB 192.168.112.20:24800
```
active (running) になり、起動しました

####停止
```
$ systemctl stop synergyc.service
```
```
$ systemctl status synergyc.service
● synergyc.service - Synergy client
   Loaded: loaded (/usr/lib/systemd/system/synergyc.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
```
inactive (dead) になり、停止しました

####自動起動設定
```
$ systemctl enable synergyc.service
Created symlink from /etc/systemd/system/multi-user.target.wants/synergyc.service to /usr/lib/systemd/system/synergyc.service.
```
```
$ systemctl status synergyc.service
● synergyc.service - Synergy client
   Loaded: loaded (/usr/lib/systemd/system/synergyc.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 水 2018-03-14 11:12:47 JST; 4s ago
 Main PID: 3096 (code=exited, status=0/SUCCESS)
```
enabled になりました。これで自動起動するはず

####自動起動無効設定
```
$ systemctl disable synergyc.service
Removed symlink /etc/systemd/system/multi-user.target.wants/synergyc.service.
```
```
$ systemctl status synergyc.service
● synergyc.service - Synergy client
   Loaded: loaded (/usr/lib/systemd/system/synergyc.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
```
disabled になりました。自動起動無効となりました
</div></details>
##4. 修正
「3. 設定確認」のコマンド群がうまく動作しなかった場合、「2. 設定ファイルを書く」からやり直します（ファイル修正）。

##5. 自動起動確認
1. 前章の「自動起動設定」を行う
2. サーバーOSを再起動（sudo reboot）
3. サービス(synergy)の起動確認

サービスが起動していることを確認します。

synergyc の場合下記項目を確認します。

- ps -ef|grep synergyc で synergc が表示されるか？
- synergy なので、マウス・キーボードが共有できているか？

## 気になったこと
- synergyc の起動が遅い。デスクトップが表示されてからマウスカーソルが移動出来るようになるまで１分近くかかる
- WantedBy を graphical.target にしても multi-user.target　にしても synergy の起動タイミングが変わらないっぽい
 
# 参考にした記事
[「Systemd」を理解する ーシステム管理編ー | ギークを目指して](http://equj65.net/tech/systemd-manage/)
[Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも](http://enakai00.hatenablog.com/entry/20130917/1379374797)
systemctl, systemd について詳しく解説されています。
[9.6. システムのユニットファイルの作成および変更 - Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)
公式？