シャットダウンスクリプト
10.9までシャットダウン時のスクリプトとして /etc/rc.shutdown.local に処理を記載していました
/sbin/SystemStarter が 10.10 でなくなった関係でシャットダウンスクリプトが使えなくなりました。
どなたか、代替案をご存じないでしょうか?
OS X Yosemite (10.10)
10.9までシャットダウン時のスクリプトとして /etc/rc.shutdown.local に処理を記載していました
/sbin/SystemStarter が 10.10 でなくなった関係でシャットダウンスクリプトが使えなくなりました。
どなたか、代替案をご存じないでしょうか?
OS X Yosemite (10.10)
思いつきですが StartupItems では代わりになりませんか?
serviceとして登録し、停止時に希望の処理をさせるとか。
参考:Daemons and Services Programming Guide (英語ですが)
ご意見ありがとうございます。
現在 LaunchDaemon で起動させているプロセスがあり、シャットダウン処理中(厳密にはプロセスがSIGTERMを受け取ったとき)に
サーバと通信をする処理をしています。
シャットダウン処理中だとネットワークサービスが先に終了していたりして通信できない場合があり、対策として
シャットダウンスクリプトを用意していました。(これでも100%OKではないのですが。。)
詳しく理解していませんが、StartupItemsでもLaunchDaemonと同じなのかなと考えています。
既にLaunchDaemonを使われていたのですね。失礼しました。
現在 LaunchDaemon で起動させているプロセスがあり、シャットダウン処理中(厳密にはプロセスがSIGTERMを受け取ったとき)に
サーバと通信をする処理をしています。
シャットダウン処理中だとネットワークサービスが先に終了していたりして通信できない場合があり、対策として
シャットダウンスクリプトを用意していました。(これでも100%OKではないのですが。。)
ネットで見た情報ですみませんが、キチンを対策をしておかないと停止処理に十分な時間が取れない内にSIGKILLが送られることもあるようですのでご注意を。(仏に念仏かもしれませんが)
上記リンクの本編内、「Creating Launch Daemons and Agents」にある「Special Dependencies→Network Availability」あたりも参考になるかと。
詳しく理解していませんが、StartupItemsでもLaunchDaemonと同じなのかなと考えています。
私も詳しいわけではありませんが、将来的にはStartupItemsも廃止(LaunchDaemonに一本化?)になるようなことも書いてありますね。
ただ、現時点では使えるわけですし停止処理を記述できるのでシャットダウン時の処理としては扱いやすいかと考えてました。
プロパティーリストで色々指定できるようですが、違いを簡単にまとめるとこんな感じでしょうか。
LaunchDaemon
StartupItems
といったところで本題ですが、残念ながら標準の機能を使ってシャットダウン(にともなうネットワークの停止処理)の前に特定の処理を行う方法は私には見つけられませんでした。
(同じ問題に当たって、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の停止時にそプログラムの停止時に終了まで待つらしいのですが。
以上、長くなったうえ、確実なことが言えずにすいません。
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 時間ほどで調べてくれました。
情報ありがとうございます。
こちらですが、再起動とシステム終了時は実行されて、ログアウトの場合は実行されないという使い方ができるでしょうか?
Macを起動している間はずっとプロセスを実行させておきたいのですが、LogoutHook ではログアウトだけでも実行されてしまうので
私の使いたい形と少し異なってしまいます。
mac-soft-dev さんによる書き込み:
こちらですが、再起動とシステム終了時は実行されて、ログアウトの場合は実行されないという使い方ができるでしょうか?
できないです。
それと確か、この機能はApple がこの先、無くしていく機能の中に入っていたのではないでしょうか。
残念ながら ni_ki さんの書かれているとおり、ログアウト時にも実行されます。
こちらではファストユーザスイッチを使って複数ユーザでログインしていること
もあるので、ログアウト時にアンマウントされると困るのですが、単一ユーザで
使うことがほとんどなので、とりあえずファストユーザスイッチは使わないこと
にしました。
本題から外れた内容ばかりで恐縮ですが、システム終了しない問題が再発するこ
とがあったので、sleep 3 コマンドを追加して様子見しています。
LogoutHook 機能はなくしていく予定であることも、息子から聞きました。
シャットダウンスクリプト