シャットダウンスクリプト

10.9までシャットダウン時のスクリプトとして /etc/rc.shutdown.local に処理を記載していました

/sbin/SystemStarter が 10.10 でなくなった関係でシャットダウンスクリプトが使えなくなりました。

どなたか、代替案をご存じないでしょうか?

OS X Yosemite (10.10)

投稿日 2014/12/11 04:25

返信
返信: 7

2014/12/11 09:34 mac-soft-dev への返信

思いつきですが StartupItems では代わりになりませんか?

serviceとして登録し、停止時に希望の処理をさせるとか。

参考:Daemons and Services Programming Guide (英語ですが)

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/StartupItems.html

2014/12/12 02:18 ToMi への返信

ご意見ありがとうございます。


現在 LaunchDaemon で起動させているプロセスがあり、シャットダウン処理中(厳密にはプロセスがSIGTERMを受け取ったとき)に

サーバと通信をする処理をしています。

シャットダウン処理中だとネットワークサービスが先に終了していたりして通信できない場合があり、対策として

シャットダウンスクリプトを用意していました。(これでも100%OKではないのですが。。)


詳しく理解していませんが、StartupItemsでもLaunchDaemonと同じなのかなと考えています。

2014/12/13 02:16 mac-soft-dev への返信

既にLaunchDaemonを使われていたのですね。失礼しました。

現在 LaunchDaemon で起動させているプロセスがあり、シャットダウン処理中(厳密にはプロセスがSIGTERMを受け取ったとき)に

サーバと通信をする処理をしています。

シャットダウン処理中だとネットワークサービスが先に終了していたりして通信できない場合があり、対策として

シャットダウンスクリプトを用意していました。(これでも100%OKではないのですが。。)

ネットで見た情報ですみませんが、キチンを対策をしておかないと停止処理に十分な時間が取れない内にSIGKILLが送られることもあるようですのでご注意を。(仏に念仏かもしれませんが)

上記リンクの本編内、「Creating Launch Daemons and Agents」にある「Special Dependencies→Network Availability」あたりも参考になるかと。

詳しく理解していませんが、StartupItemsでもLaunchDaemonと同じなのかなと考えています。

私も詳しいわけではありませんが、将来的にはStartupItemsも廃止(LaunchDaemonに一本化?)になるようなことも書いてありますね。

ただ、現時点では使えるわけですし停止処理を記述できるのでシャットダウン時の処理としては扱いやすいかと考えてました。

プロパティーリストで色々指定できるようですが、違いを簡単にまとめるとこんな感じでしょうか。

LaunchDaemon

  • 起動時:指定されたコマンドを実行。
  • 停止時:実行中のプロセスにSIGTERMを送る。
  • 依存時:フレームワークから自動判断

StartupItems

  • 起動時:"start"を引数として指定されたコマンドを実行。
  • 停止時:"stop"を引数として指定されたコマンドを実行。
  • 依存性:プロパティーで記述

といったところで本題ですが、残念ながら標準の機能を使ってシャットダウン(にともなうネットワークの停止処理)の前に特定の処理を行う方法は私には見つけられませんでした。

(同じ問題に当たって、shutdownコマンドを置き換えて、希望の処理をおこなってから本来のshutdownを実行するように変更した人はいるようですが)

もしかすると、起動させたプロセスが確実に終了処理をできるようにしたほうが早かったりするかもしれませんね。

LaunchDaemonのplistでtransactionの使用状況を設定できるようですが、どうなされてますか。(以下、man launchd.plsitより)

EnableTransactions <boolean>

This flag instructs launchd that the job promises to use vproc_transaction_begin(3) and vproc_transaction_end(3) to

track outstanding transactions that need to be reconciled before the process can safely terminate. If no outstanding

transactions are in progress, then launchd is free to send the SIGKILL signal.

これをfalseにすると逆にdaemonの停止時にそプログラムの停止時に終了まで待つらしいのですが。


以上、長くなったうえ、確実なことが言えずにすいません。

2015/01/07 21:01 mac-soft-dev への返信

defaults コマンドを使って以下のように指定すれば、/Users/Shared/

.logouthook ファイルに記述された内容が、ログアウトやシステム終了時に実行

されるようになりました。


defaults write com.apple.loginwindow LogoutHook /Users/Shared/.logouthook


以下のコマンドで、実行可能形式にしておく必要があります。


chmod +x /Users/Shared/.logouthook


いずれも sudo コマンドに続けて実行する必要があります。


こちらでは、Yosemite プリインストールの Mac mini Late2014 に買い替えたと

ころ、手持ちの 3 台の外付け USB HDD のうち特定の 1 台をつないでいると、

システム終了を選んでも正しく終了しない(黒画面にカーソル表示)問題が発生

していました。


この HDD を事前にアンマウントしておけば問題が発生しないので、システム終

了直前にコマンドでアンマウントさせるため、/Users/Shared/.logouthook ファ

イルに以下の内容を記述しておいた上で、前記のとおり実行したら問題が解決し

ました。


----------

#!/usr/bin/env bash


diskutil unmountDisk /dev/disk2

----------


これなら /etc/rc.shutdown.local で処理されていたのと同じ感覚で使えるので

はないかと思います。


P.S.


アカウントを登録したばかりの初心者ですが、よろしくお願いします。


2 ~ 3 日悩んで息子に相談したら、1 時間ほどで調べてくれました。

2015/01/09 00:33 VAXの巨人 への返信

情報ありがとうございます。

こちらですが、再起動とシステム終了時は実行されて、ログアウトの場合は実行されないという使い方ができるでしょうか?

Macを起動している間はずっとプロセスを実行させておきたいのですが、LogoutHook ではログアウトだけでも実行されてしまうので

私の使いたい形と少し異なってしまいます。

2015/01/09 05:49 mac-soft-dev への返信

mac-soft-dev さんによる書き込み:


こちらですが、再起動とシステム終了時は実行されて、ログアウトの場合は実行されないという使い方ができるでしょうか?

できないです。

それと確か、この機能はApple がこの先、無くしていく機能の中に入っていたのではないでしょうか。

2015/01/09 07:49 mac-soft-dev への返信

残念ながら ni_ki さんの書かれているとおり、ログアウト時にも実行されます。


こちらではファストユーザスイッチを使って複数ユーザでログインしていること

もあるので、ログアウト時にアンマウントされると困るのですが、単一ユーザで

使うことがほとんどなので、とりあえずファストユーザスイッチは使わないこと

にしました。


本題から外れた内容ばかりで恐縮ですが、システム終了しない問題が再発するこ

とがあったので、sleep 3 コマンドを追加して様子見しています。


LogoutHook 機能はなくしていく予定であることも、息子から聞きました。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

シャットダウンスクリプト

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。