systemdでshutdown時にプロ生ちゃんに挨拶してもらう

この記事はLinux Advent Calendar 2014の8日目の記事です。

systemdでシステムshutdown時に何かさせる場合の.serviceファイルについて書いてみたいと思います。
systemdで何かを実行する場合、どこにインストールするか(Installセクションをどうするか)が重要で通常のサービスだとmulti-user.targetを指定していると思います。
今回はshutdown時に実行させたいのでInstallセクションにはshutdown.targetを指定します。

では.serviceファイルを見てみましょう

[Unit]
Description=Pronama-chan gives you to greeting when system is going to be shutdown
Before=shutdown.target alsa-store.service
DefaultDependencies=no
ConditionFileIsExecutable=/usr/local/bin/pronama-chan-greeting.sh

[Service]
Type=oneshot
ExecStart=/usr/local/bin/pronama-chan-greeting.sh

[Install]
WantedBy=shutdown.target

まずはUnitセクションから見て行きましょう。ここでは通常の.serviceでは見ないConditionFileIsExecutableDefaultDependenciesを使ってます。
前者のConditionFileIsExecutableConditionPathExists族の処理で、名前の通りですがファイルが存在してかつ実行属性が付いているかのチェックを行っています。 これは!で否定することもできるので、ファイルがない場合に実行ということもできます。まあ、今回の処理だと別に不要なんですがなんとなく使ってます。

DefaultDependenciesは通常不要でデフォルトはyesとなっています。これは普通のサービスならシステムがある程度起動してからじゃないとサービスを起動できないなどの依存がありますが、ここではあえてnoに設定しています。yesで試したらうまく動かなかったです。

Beforeにはshutdown.targetとalsa-store.serviceを指定しています。とりあえずshutdown.targetよりも前に動かさないといけないのでこれは必須ですね。

次のServiceセクションですがこれは特に変わったことはしていません。

最後のInstallセクションですがこれは冒頭で説明したとおりshutdown時に動かすサービスなのでshutdown.targetを指定してます。

実行するpronama-chan-greeting.shは単にmpg123でmp3ファイルを再生させてるだけなので割愛します。

さて、今回作成した.serviceをenableして実行したのが↓になります。gnome3のpower offのメニューで電源offをクリックしたらすぐに音声が再生されます。下の動画で音が出ない人は音声がミュートされているかも(動画画面の端に出るスピーカーアイコンをチェック)。

Watch masami256's Vine "systemd便利♪( ´▽`)"