bashの設定により、ターミナル起動時と終了時にスクリプトを自動実行させられます。
これによりbash利用環境では機器の起動・終了と連動して特定の処理を行えます。
bash起動時は~/.bashrcを実行
bash起動時にはユーザーごとの~/.bashrc
が実行されるため、単に実行するコマンドまたはスクリプトを記述すると自動実行できます。
<some-startup-command>
bash終了時はEXITシグナルをトラップ
終了時はbash組込みのtrap
コマンドでEXITシグナル受信時の動作を指定しておくと自動実行できます。
~/.bashrc
に以下のような記述を追加するとtrap
を定義できます。
trap "<some-cleanup-command>" EXIT
EXITシグナルはターミナル終了などbashを抜ける操作のほか、電源断の場合にも動作します。
tmuxはhookで自動実行可能
ターミナルでtmuxを併用している場合、作業終了時に必ずしもbashを終了しない使い方が一般的です。
tmuxを利用する場合には、tmuxが提供する
hooks機能を利用します。
~/.tmux.conf
に以下のような設定を記述すると動作します。
set-hook -g session-created 'run "<some-startup-command>"'
set-hook -g client-attached 'run "<some-startup-command>"'
set-hook -g client-detached 'run "<some-cleanup-command>"'
hooksのリストはtmux show-hooks -g
コマンドで確認できます。
tmuxのセッションをひと通り終了しないと変更が効かないケースがあるため、想定どおりに動作しない場合にはdetach->attachではなく、クリーンアップのうえ最初から動作させる方が確実でしょう。
スクリプト実行の注意点
シェルのhookから任意のスクリプトを実行できますが、ツールのPATHが有効であることが必要です。
たとえば、rbenvでインストールしたrubyなどは一般的なPATHに置かれない場合があります。
実行スクリプトのshebangがenv
コマンドで探索する場合、このタイミングの環境変数PATH
に依存します。
#!/usr/bin/env ruby
一般的でないPATHもhookと同様に.bashrc
などで追加することが多いため、シェル起動時に実行するhookの前に必要なPATHをセットアップする順序関係が必要です。
ユーザーセッションの前後に実行するhookはエラーログを出力しないため、該当コマンドを手動実行したり、env ruby
を手動実行することで地道にトラブルを切り分けます。
Chuma Takahiro