見出し画像

【CLI ライフハック】 crontab で早寝早起き

概要

この記事ではこの前の動物の鳴き声のアラーム作成の
記事
で作成したアラームを crontab で定期実行する
スクリプトをコードします
動物の鳴き声のアラームは朝の目覚めにはいいですが
就寝前のアラームとしてはうるさいので、就寝アラーム
用に新しくコードを考えます

読み飛ばす

今回のスクリプトは Github の方に上げてあります
とりあえず使いたい方は以下のコマンドを実行後、
crontab に登録 に飛んで下さい:

cd ~
git clone https://github.com/alpineyahoo/.cron.git

環境設定

$ sw_vers
ProductName:	macOS
ProductVersion:	12.3
BuildVersion:	21E230
$ brew install zsh mplayer (tree)

コマンド構成

仕様

  • 07:00 牧場風に起こされる

  • 23:00 子守唄のオルゴールとあくびといびきで就寝
    時間を知る

  • 通知ダイアログが表示される

  • ダイアログを完了すると音声も止まる

  • ダイアログを完了しなくても所定時間が経過すれば
    自動で音声が止まる

こんな感じの仕様にしたいですね…

今回使用するシェルとコマンド

zsh, afplayer, mplayer, osascript,
pkill, crontab, (tree)

  • osascript: Applescript を実行するコマンドです

  • pkill: プロセスをプロセス名指定で停止できます

並列実行

ダイアログを表示するコマンドと音声再生のコマンドを
並列実行させ、また音声ファイルを利用することから、
今回はバンドル作成、つまり新しくディレクトリを作成
してその中に複数のコマンドと音声ファイルフォルダを
作るというやり方で進めていきます

シェル藝の時間

始めに

コマンドをホームディレクトリ配下に作成したいと
思います:

mkdir ~/.cron
cd ~/.cron
mkdir sleep wakeup
# wakeup: 起床用, sleep: 就寝用


cd sleep # sleep ディレクトリ配下を編集
touch cronzzz dialog main
chmod +x ./*
mkdir sounds # 音声ファイルを配置するディレクトリ作成


cd ../wakeup # wakeup ディレクトリ配下を編集
touch cronranch dialog main
chmod +x ./*


# cronzzz, cronranch: 音声ファイル再生コマンド
# dialog: ダイアログ表示コマンド
# main: 並列実行コマンド


cd .. # ~/.cron ディレクトリに移動
pwd # 一応現在のディレクトリ (~/.cron) 確認
tree # ディレクトリ階層を表示
open . # Finder で確認したければ

目覚まし

下記実行で編集開始:

cd ~/.cron/wakeup
nano cronranch

名前が cronranch の実行ファイルには前回の記事
作成したコマンドから ttimer を除いて繰り返し回数を
変更した以下の内容をコピペ:

#!/usr/bin/env zsh

summon () {
    /usr/local/bin/mplayer -really-quiet http://www.google.com/logos/fnbx/animal_sounds/${1}.mp3
}
repeat 5 {
    summon rooster &
    summon horse &
    summon cow
}

# mplayer は絶対パスである必要があるみたいです

次は名前が dialog の実行ファイルを編集:

nano dialog

ユーザーがダイアログ表示を完了させた後、並行実行している cronranch を停止させる pkill コマンドを記述しますが、シバングを osascript にする関係で osascript からシェルスクリプトを実行するメソッド:
do shell script "foobar"
を使用します
以下を記述:

#!/usr/bin/osascript

display dialog "Good morning" buttons {"OK"} default button "OK" giving up after 14

# メッセージ: "Good morning"
# OK ボタンで完了
# 音声再生が終了する14秒後にはボタンプッシュがなくても自動的に完了

do shell script "pkill -f cronranch mplayer"

# cronranch と mplayer を停止

名前が main の実行ファイルを編集:

nano main

ファイル内容は以下:

#!/usr/bin/env zsh

cd ~/.cron/wakeup/ # この記述必要です
./cronranch & ./dialog

これで目覚ましの方は完成 :)
試しに以下を実行して動作を確認してみましょう:

~/.cron/wakeup/main

就寝時間通知アラーム

落ち着いた感じの音声ファイルを用意しましょう
上記の音声ファイルをダウンロード・展開し、音声
ファイルを下記のディレクトリ内に配置:

~/.cron/sleep/sounds/

下記実行で編集開始:

cd ~/.cron/sleep
nano cronzzz

ファイル内容は以下:

#!/usr/bin/env zsh

afplay -t 17 ./sounds/lullaby.mp3 &
afplay -t 17 ./sounds/yawning.mp3 &
afplay -t 17 ./sounds/snoring.mp3

# 三種類のファイルを並行再生

dialog を編集
内容は以下:

#!/usr/bin/osascript

display dialog "Have a good night's sleep" buttons {"OK"} default button "OK" giving up after 17
do shell script "pkill -f cronzzz afplay"

main を編集
内容は以下:

#!/usr/bin/env zsh

cd ~/.cron/sleep/
./cronzzz & ./dialog

これで就寝時間通知アラームの方も完成 :)
試しに以下を実行して動作を確認してみましょう:

~/.cron/sleep/main

crontab に登録

以下のコマンドで現在の crontab 設定が確認できます:

crontab -l

crontab のタスク内容を編集していきますが、デフォルトのエディタは vim のようなので、nano を使いたい方はまず以下のコマンドを実行:

echo "export EDITOR=nano" >> ~/.zshrc
source ~/.zshrc

# bash の場合は ~/.zshrc のところは ~/.bashrc
# 注意: ">>" は絶対に ">" と書かない(上書き保存されてしまいます)

crontab のタスク内容を編集:

crontab -e

以下を追記:

00 7 * * * ~/.cron/wakeup/main
00 23 * * * ~/.cron/sleep/main

# 一例です

完了です :)
これで健康な生活をゲットできる…!?

まとめ

今後は GitHub での公開がメインになるかも…
しかし一般的には note.com の方がソーシャル性のある
プラットフォームであると思われるので、こちらでも
時々投稿しようかなと思っています :)

追記('22 03/15)

Mac では crontab よりも launchd の方が推奨
なんですね、知りませんでした…
今度は launchd の方でトライしてみようっと :)

感想・ご指摘お待ちしています