bash起動・終了時のスクリプト自動実行

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