WSLでサービスを自動起動する（勝手翻訳：WSL Tips: Starting Linux Background Services on Windows Login）

WSLでサービスを自動起動する方法についてまとめられている記事です。
[WSL Tips: Starting Linux Background Services on Windows Login](https://dev.to/ironfroggy/wsl-tips-starting-linux-background-services-on-windows-login-3o98)
Expert Amateur 2018年7月15日 ・3 min read

以下に日本語訳を記載します。


#WSL Tips: Starting Linux Background Services on Windows Login

ますます多くの開発者が、Windows Subsystem for Linux (WSL) が非常に優れていることを知っています。Windows 上で確立された *nix ツールのトンを透過的に使用できるようになることで、あなたのマシンは、ユーザーと開発者の両方として、両方の長所を兼ね備えたハイブリッドなものになります。

WSL のアップデートでは、以前はライブシェルの下で WSL プロセスを実行する必要がありましたが、Linux コンソールウィンドウがすべて閉じているときにバックグラウンドタスクをサポートするようになりました。しかし、Linux セッションは明示的にしか起動できないため、サービスを自分で起動する必要がありました。PostgresqlやRabbitMQなどのサービスを起動するための起動設定はありませんでした。

何度か再起動した後、これらのサービスを手動で起動することを怠っていたので、マシンを起動したときに自動的にWSL層のバックグラウンドでPostgresを起動させる方法が欲しかったのです。

ここでは、Windowsのログイン時にWSLのバックグラウンドサービスを起動する方法を説明します。

まず、スタートアップスクリプトが必要です。私は start_postgresql.sh と呼んで ~/.local/bin/ に置きました。私のは Postgres サービスを起動するだけですが、他の多くのサービスを起動したり、必要に応じて他の起動時のアクションを行うことができます。

```
mkdir -p ~/.local/bin/ 
echo "service postgresql start" >> ~/.local/bin/start_postgresql.sh
chmod +x ~/.local/bin/start_postgresql.sh
```

もちろん、サービスを実行するにはsudo privledgesが必要です。しかし、対話なしで起動時にこれを実行する必要があり、パスワードなしのsudoを有効にしたくないので、どうすればいいのでしょうか？

特定のコマンドに対してパスワードなしのsudoを有効にすることで、安全性のチェックなしにユーザが何でもsudoできるというセキュリティ上の欠陥を有効にすることができることがわかりました。visudo を開いて sudo の設定を編集します。

```
sudo visudo
```
高橋追記：visudoのエディタの変更　
$ sudo update-alternatives --config editor

そして、この行を追加して、このスクリプトだけをsudoで実行できるようにします。

```
calvin ALL=(root) NOPASSWD. /home/calvin/.local/bin/start_postgresql.sh
```

これでいいですね! もちろん、あなたの名前は私のように "calvin "ではないでしょう。それを自分のユーザ名に変更してください。

あとは、ログイン時にWindowsがこのスクリプトをWSLレイヤーで実行するようにするだけです。これにはタスクスケジューラを使うことができるので、スタートメニューを開いて「Task Scheduler」と入力し、アプリケーションを見つけて実行する。

左側の「Task Scheduler Library」をクリックし、右側の「Create Task...」をクリックして、以下の手順でスクリプトを実行するように設定できる新しいタスクを作成する。

- タスクには、"Start Postgres "のように好きな名前を付けます。
- トリガー」タブで「新規（New...）」をクリックして、このタスクに新しいトリガーを追加します。
- 「タスクの開始」ドロップダウンで「ログオン時」を選択します。
- 「任意のユーザー」を選択
- 「操作」タブで「新規」をクリックして、このタスクに新しいアクションを追加します。
- アクションタイプの「プログラムの開始」を選択し、実行するプログラムとして「C:\Windows\System32\bash.exe」と入力します。
- 最後に、最後の重要なステップとして、"引数の追加（オプション）(A) "で、この引数文字列を設定してコマンドを実行します。
\-c "sudo ~/.local/bin/start_postgresql.sh"


必要なのはそれだけです。次にWindowsにログインすると、このタスクが起動され、カスタムスクリプトをrootとして実行し、Postgresや他のサービスを起動します。

うまくいけば、これにより、Linuxツールを使ったWindows上での開発が、WSLがすでに行っているよりもさらに簡単になるでしょう!

# タスクスケジューラ（高橋追記）
タスクスケジューラに登録したら、コマンドが動くことを確認しましょう。
登録したタスクを選択して、①実行を選ぶことで、設定したタスクを実行することができます。
コマンドの実行結果は、①すべての履歴を有効にする、を選択しておくことで、②履歴を見ることができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/46603d8b-95ed-64f0-3b39-978fd3af190c.png)

## シャットダウン時に実行する

リブート時や、異常終了の時は実行されないとは思うのだけど、何はともあれ入れてみる。

[[Windows]シャットダウン時に特定プログラムを実行させる方法](https://attrise.blog/ceo/archives/3721#:~:text=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E3%80%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D,%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%80%82&text=%E3%81%A8%E9%96%8B%E3%81%84%E3%81%A6%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%82%92,%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%80%82&text=%E3%81%93%E3%82%8C%E3%81%A7Windows%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3,%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)

Windowsの設定からGUIで設定可能！
Yahoo知恵袋 yuki_wa_ore_no_yomeさんの質問から抜粋

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1426653504

グループポリシーを使用

スタートメニューの「ファイル名を指定して実行」に
「gpedit.msc」と入力してOKでグループポリシーが起動する。
コンピューターの構成→Windowsの設定→スクリプト（スタートアップ/シャットダウン）
と開いてシャットダウンをダブルクリック。

追加ボタンを押してスクリプト名に実行したいプログラムを設定。
（スクリプトと書いてありますが、プログラムやDOSコマンドも設定可能です）
これでWindowsのシャットダウン時に、指定のプログラムが実行されます。