毎日やる手作業コマンドをlaunchdを使って定期的に自動実行してみた

# はじめに

- 骨休め的なTipsです。
- Macの方対象となります。

# 背景

私がほぼパソコンを起動する日にやることとしては、
インストールしているソフトウェアのアップデートとゴミファイルの掃除です。

具体的には、以下のようなコマンドを実行しています。

## Homebrewのアップデート

### Homebrewとは
https://brew.sh/index_ja

```
brew update && brew upgrade && brew cask upgrade
```

## pipのアップデート

### pipとpip-revieｗとは

https://ja.wikipedia.org/wiki/Pip
https://github.com/jgonggrijp/pip-review

```
pip-review --auto
```

## .DS_Storeの削除

### .DS_Storeとは

http://uxmilk.jp/48160

```
find ~/. -name '.DS_Store' -type f -ls -delete
```

# やること

今回はこれらをlaunchdというツールを利用して定期的に自動実行するように設定します。

## 自動実行するシェルスクリプトを作成する

### シェルスクリプトの格納先ディレクトリの作成

```
mkdir ~/Scripts
```

### アップデート系シェルスクリプトを作成する

- 実行コマンドはフルパスで書いてください

### anyenvとは
https://github.com/riywo/anyenv

```sh:update.sh
/usr/local/bin/brew update && /usr/local/bin/brew upgrade && /usr/local/bin/brew cask upgrade
/Users/{ログインユーザー名}/.anyenv/envs/pyenv/shims/pip-review --auto
```

### お掃除系シェルスクリプトを作成する

- 実行コマンドはフルパスで書いてください

```sh:delete.sh
/usr/bin/find ~/. -name '.DS_Store' -type f -ls -delete
```

## launchdにシェルスクリプトを実行するジョブを作成する

### アップデート系のジョブ作成

```xml:~/Library/LaunchAgents/update.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>update</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/zsh</string>
        <string>/Users/{ログインユーザー名}/Scripts/update.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/{ログインユーザー名}/Scripts/logs/update.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/{ログインユーザー名}/Scripts/logs/update_error.log</string>
</dict>
</plist>
```

#### 解説

- スクリプトの実行はZshを使うように指定してます。

##### Zshとは

https://ja.wikipedia.org/wiki/Z_Shell

```
<string>/usr/local/bin/zsh</string>
```

- 実行時間は、」毎日お昼の１２時に実行するように設定しています。

```
<dict>
    <key>Hour</key>
    <integer>12</integer>
    <key>Minute</key>
    <integer>0</integer>
</dict>
```

- 実行ログとエラーログを以下のように出力するようにしております。

```
<key>StandardOutPath</key>
<string>/Users/{ログインユーザー名}/Scripts/logs/update.log</string>
<key>StandardErrorPath</key>
<string>/Users/{ログインユーザー名}/Scripts/logs/update_error.log</string>
```

### お掃除系のジョブ作成

#### 解説

- update.plistとほぼ同様です。
- こちらの実行時間は、毎日午前１０時に実行するように設定しています。

```xml:~/Library/LaunchAgents/update.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>delete</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/zsh</string>
        <string>/Users/{ログインユーザー名}/Scripts/delete.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/{ログインユーザー名}/Scripts/logs/delete.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/{ログインユーザー名}/Scripts/logs/delete_error.log</string>
</dict>
</plist>
```

## launchdに作成したジョブを登録する

- 上記で作成したジョブを以下のコマンドで登録すれば完了です。

```
launchctl load ~/Library/LaunchAgents/update.plist
```

```
launchctl load ~/Library/LaunchAgents/delete.plist
```

#　さいごに

- 実行されているかどうかは、上記で設定したログを見てみれば確認できるはずです。
- ほかにも、好みによって定期的に実行したいものをどんどん登録していけるのでぜひやってみてください。