スリープ復帰時にログイン画面を表示したい
iMacを複数ユーザーで使用しています。
ログイン状態からスリープを選択するだけで、同時にログアウトし、復帰後、ユーザー選択のできるログイン画面を表示するような設定は可能でしょうか?
現在は、各自ログオフしてから、通常ログイン画面にてスリープをしております。
iMac (21.5-inch, Late 2012), OS X Mavericks (10.9.3)
iMacを複数ユーザーで使用しています。
ログイン状態からスリープを選択するだけで、同時にログアウトし、復帰後、ユーザー選択のできるログイン画面を表示するような設定は可能でしょうか?
現在は、各自ログオフしてから、通常ログイン画面にてスリープをしております。
iMac (21.5-inch, Late 2012), OS X Mavericks (10.9.3)
「ログアウト⇔スリープ→ログイン画面」という図式にしようとしているのに無理があるのでしょうか……
今回の質問の基本的な趣旨としては、
・素早く起動ができる。
・確認メッセージもなく、ものすごく簡単にログアウトとスリープができる。
・スリープ解除後、自分のアカウント(ユーザー)を迷わず選択できる。
以上の要件を満たした方法が理想なのですが……
基本的にログアウトしたら自分の操作権限はなくなりますので、ログアウト後に任意でスリープさせるのは外部からのリモート操作などの方法しか無い気がします。
ともあれ、automatorでスリープさせてもいいなら、スリープ解除するとログアウトできそうな感触ですのであげておきます。
あくまで、参考までです。
スリープ用のアイコンを解りやすく作って、ドックに入れて使ってもらうといいのかもしれません。
on run {input, parameters}
tell application "System Events" to sleep
return input
end run
on run {input, parameters}
tell application "System Events" to keystroke "Q" using {command down, option down, shift down}
return input
end run
別にni_kiさんのスクリプトにケチを付けているわけではないのですよ。
もっとも根本的な問題なのだけど、トピ主としてはスリープに入った時点で有無を言わさずログアウトさせたいという事ですよね。復帰後はユーザ全員の名前が一覧で表示されるログイン画面に戻りたいということですから。
ファーストユーザスイッチでのユーザの切り替えでの切り替えは行いたくないと。(理由はなんでしょうかね? ひょっとすると複数のユーザで使用すると誤動作を起こすようなアプリをインストールしてあるのでしょうか)
だからエラーダイアログが表示されてログアウトが阻止されてしまってはトピ主の意図する動作ではなくなってしまうと思うのですよ。でもトピ主の意図する動作(スリープ直後にユーザに確認をとることなくログアウト)を実装するとしたら未保存の書類は破棄しなくてはいけなくなる。これって大丈夫?って話。
いやいやそういう事ではなくて、ログアウトしていなくてもスリープ復帰時は直前にログインしていたユーザ名だけでなく全員の名前を表示してもらいたいって意味ならまた考え方は違ってくるのだけど。
そちらの利用状況がおそらく一般的でないため、はずした回答になっているかもしれませんが....。
当方、高齢者も何人かみえますので「自動でスリープになる」より「自分で消した」という方向にしたいからです。
これが目的であれば、使用後にログアウトするように促すのはどうですかね。しかし、ユーザのスキルによりログアウトする事自体が出来ない場合は、HALさんが書かれた
「システム環境設定」>「セキュリティとプライバシー」>「詳細...」に「使用しない状態がxx分間続いたらログアウト」という設定もあります。ご参考までに。
この設定を行えば良いのではないでしょうか。
ご指摘、ありがとうございます。
iMac(Late 2012)OS X 10.9.3では確認し異常無かったのですが、指摘を受けMacBook Pro(Retina, Mid 2012)OS X 10.9.3で確認したところカーネルパニックが100%近い確率で発生いたしました。ログアウトが完了していない状態でスリープが実行されるのがダメなようです。
そこで作戦を変更し下記で試したところ、両方のMacで正常に動作いたしました。
LogoutHookでファイルを書き出すスクリプトを実行して、LaunchDaemonでそのファイルの変更を監視して、pmset コマンドを実行です。ログアウトしてから安定するのを待つためにsleep 3を入れました。
これならログアウト時に、通常のスリープが行われるのと変わらないと思われます。
LaunchDaemonsに下記。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.ni.logoutsleep</string>
<key>ProgramArguments</key>
<array>
<string>/Users/niki/Documents/pmsetsleepnow.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Users/niki/sleepnow.txt</string>
</array>
</dict>
</plist>
<!-- @@@@LingonWhatStart:@@@@LingonWhatEnd -->
pmsetsleepnow.shが下記。
#!bin/sh
sleep 3
pmset sleepnow
LogoutHookで下記、スクリプトを実行。
#!bin/sh
cat /Users/niki/Documents/pmsetsleepnow.sh > /Users/niki/sleepnow.txt
xmlの作成はMac App StoreよりLingon3を購入して行いました。
シェルスクリプトにしてしまえば、そのファイルをダブルクリックすれば出来るかと思って考えてみたのですがsudo コマンドを使用する都合でパスワード入力を求められかえって煩雑になることがわかりました。
解決策にはほど遠いですが、誰かが方法を思いつくかもなので記載させていただきます。
sudo shutdown -s +1
で1分後のスリープをしかけてから
osascript -e 'ignoring application responses' -e 'tell application "loginwindow" to «event aevtrlgo»' —e end
でログアウトです。
下記で行おうとしたらログアウトしてしまうのでスリープイベントが実施されないようです。
osascript -e 'ignoring application responses' -e 'tell application "loginwindow" to «event aevtrlgo»' —e 'tell application “System Event” to sleep’ -e end
ajinohiraki さんによる書き込み:
簡単なようで中々うまくいきません……
スリープ前にログアウトしてしまうので、スクリプトが途中で終了してしまうのが問題ですよね。ログアウト後も動く方法を探すとかCで書ければ、出来そうな気がするのですが、残念ながら私にその能力はありません。申し訳ないです。
あっ、もう一つアイディアだけは思いついたので記載させていただきます。pmset コマンドならスリープは指定時間にできますしパスワード無しで実行できるので、スクリプトで実行時刻を取得して現在時刻 + 60秒とかでpmset コマンドを仕掛けてログアウトする手です。
MacBook Airから送信
2014-06-10 9:48 PM、やすどん <discussions@apple.co.jp> のメッセージ:
もしスリープ直後に直ちにログアウトするような仕様だと、スリープに入った時点で保存していない全ての書類が失われる事になりそうな気がします。
スリープしてから正常にログアウトできるのか不明ですが、未保存の書類があれば、スリープしてからログアウトできたとしても通常なら警告が出てログアウトが止まるので大丈夫でしょう。私が試した限りでは、警告が出てログアウトが一旦は止まります。
ログイン状態からスリープを選択するだけで、同時にログアウトし、復帰後、ユーザー選択のできるログイン画面を表示するような設定は可能でしょうか?
ログイン状態から「スリープ」ではなく「ログアウト」を選択すれば丸く収まる話なのではないのでしょうか・・・?
あと「システム環境設定」>「セキュリティとプライバシー」>「詳細...」に「使用しない状態がxx分間続いたらログアウト」という設定もあります。ご参考までに。
煩雑ですが一応、ログアウト後スリープが出来ましたので書き込ませていただきます。
AppleScript エディタで
do shell script "sudo nohup logoutSleep.sh" with administrator privileges
を実行。
logoutSleep.shの中身は下記です。
#!/bin/sh
osascript -e 'tell application "loginwindow" to «event aevtrlgo»' -e end
sleep 1
osascript -e 'do shell script "pmset sleepnow" with administrator privileges' -e end
アプリケーションで保存がされていない物が有る場合は、通常通りに保存するか聞いてきます。
書類の保存に手間取ったりして、ある程度の時間経過するとpmset コマンドが実行されてログインしたままスリープに移行するようで。
admin権限を使用していますので、管理者パスワードを聞かれます。
上記のApple Scriptをアプリケーション方式で保存すれば万事解決と思ったのですが、自身が終了できずに成功しません。
違う方法を思いついたのですが、力及ばずで実際に制作できませんでした。
他の方が見たときに実現できるかもしれないのでアイディアだけですが、書き込ませていただきます。
launchdを使用してログを監視して、ログアウトを検知したらpmset sleepnow コマンドでスリープさせる方法です。
ログアウトしているのでpmset コマンドを実行できないようです。
参考にさせていただいたのは下記です。
いえいえ、とんでもないです。
私も色々試してみましたが、どうもうまく動作しません。
オフィシャルな設定で簡単に出来ても良さそうなことなのですが……
「ログアウト⇔スリープ→ログイン画面」という図式にしようとしているのに無理があるのでしょうか……
今回の質問の基本的な趣旨としては、
・素早く起動ができる。
・確認メッセージもなく、ものすごく簡単にログアウトとスリープができる。
・スリープ解除後、自分のアカウント(ユーザー)を迷わず選択できる。
以上の要件を満たした方法が理想なのですが……
難しいですね。
> 複数で使っているのなら、下手に自動にするのではなく、"ちゃんとログアウトする"という癖を付ける
この意見に一票。
オフィスなどでコンピュータを導入するとなると、日本では、従来のワークフローを変えたくないあまり、ベンダーにそういうふうなシステムを導入することを要求し、ベンダーもその辺はカスタマーに合わせてシステムを変更せざるを得ないので、高いものになりがち、という話はよくあります。カスタマイズするとなるとほんのちょっとしたことでも、システムの値段と同じくらいかかってしまいます。今回も、常連の面々がこんなスクリプトで出来る、、、とやっているのを見るとそう思います。
コンピュータは万能ではありませんので、安く使いたいなら、汎用のシステム(ソフトウェア)で間に合うように、感情云々は抜きにして、ユーザ側のリテラシを高めるべきと思います。どうしても感情の問題が出るのなら、複数機を導入すれば済むことでは?カスタマイズするよりそちらの方が安上がりなことが多いと思う。
ありがとうございます。
おっしゃるとおりです。
私も同意見ですので、ユーザーに理解と学習を求めるのが初めなのは承知で質問しております。
何分、当方、高齢者も多く、世代の面でも理解を求めるのはかなりの難所になります。
私の質問の仕方にも問題がありました。
ですので、ちゃんとログアウトを選択すれば自動でスリープでもかまいません。
設定を変えれば出来るはずと思っていた私も浅はかでした。
はに様のおっしゃる主旨とは、ずれた回答になってしまいましたが、失礼します。
ajinohiraki さんによる書き込み:
私も色々試してみましたが、どうもうまく動作しません。
なんとかLaunchDaemonsにplistファイルをおいてログが変更されることを検出することまではたどり着きました。ただsystem.logファイルの変更は検出はできず/private/var/logフォルダの変更を監視ですが。変更を検出後に先に参考にさせていただいたサイトのAppleScriptを変更して特定の記録がなされたら、今度はそれを検出するようにしたつもりなのですが、それが出来ません。例えば
set newLog to do shell script "/usr/bin/tail /private/var/log/system.log | /usr/bin/grep -i 'DEAD_PROCESS'"
としてもnewLogに「DEAD_PROCESS」が書き込まれません。
試しに
set newLog to do shell script "/usr/bin/tail /private/var/log/system.log | /usr/bin/grep -i 'e'"
にしてみたのですが反応なしです。
スリープ復帰時にログイン画面を表示したい