Posted at

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

More than 1 year has passed since last update.


はじめに


  • 骨休め的なTipsです。

  • Macの方対象となります。


背景

私がほぼパソコンを起動する日にやることとしては、

インストールしているソフトウェアのアップデートとゴミファイルの掃除です。

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


Homebrewのアップデート


Homebrewとは

https://brew.sh/index_ja

brew update && brew upgrade && brew cask upgrade


pipのアップデート


pipとpip-reviewとは

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


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


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


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


delete.sh

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



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


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


~/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>


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

<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とほぼ同様です。

  • こちらの実行時間は、毎日午前10時に実行するように設定しています。


~/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


 さいごに


  • 実行されているかどうかは、上記で設定したログを見てみれば確認できるはずです。

  • ほかにも、好みによって定期的に実行したいものをどんどん登録していけるのでぜひやってみてください。