システムをシャットダウンする最善の方法は、次のコードを使用することです
import os
os.system('systemctl poweroff')
多くの Linux ディストリビューションでは、06
を実行するためにスーパー ユーザー権限が必要です。 または 13
、しかし、では、コンピュータの前に座っている場合、root にならなくても電源をオフにできるのはなぜでしょうか?メニューを開いて シャットダウン を押します 23
になることなくシャットダウンします ですよね?
うーん... 根拠 この背後にあるのは、コンピュータに物理的にアクセスできる場合は、電源コードを引っ張って電源を切ることができるということです。そのため、最近では多くのディストリビューションで 30<経由でアクセスできるローカル システム バスにアクセスして電源を切ることができます。 /コード> .
48
の問題 (またはそれを通じて公開されるサービス)?それは絶えず変化しています。 D-feet などの dbus ビューアー ツールをインストールすることをお勧めします (注意:視覚化するのはまだかなり難しいですが、役に立つかもしれません)
これらの Dbus シャットダウン スクリプトをご覧ください。
ディストリビューションにまだ HAL がある場合 (廃止予定の場合)、これを試してください:
import dbus
sys_bus = dbus.SystemBus()
hal_srvc = sys_bus.get_object('org.freedesktop.Hal',
'/org/freedesktop/Hal/devices/computer')
pwr_mgmt = dbus.Interface(hal_srvc,
'org.freedesktop.Hal.Device.SystemPowerManagement')
shutdown_method = pwr_mgmt.get_dbus_method("Shutdown")
shutdown_method()
これは Ubuntu 12.04 で動作します (動作を確認するためにコンピューターの電源をオフにしました)。新しいものをお持ちの場合...まあ、うまくいかないかもしれません。これは、この方法の欠点です。ディストリビューション固有です。
53
をインストールする必要があるかもしれません これが機能するためのパッケージ (http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html)
更新 1:
私は少し調査を行ってきましたが、これは ConsoleKit を介して新しい Ubuntu バージョンで行われているようです。 Ubuntu 12.04 (非推奨の HAL と新しい ConsoleKit を含む) で以下のコードをテストしたところ、コンピューターがシャットダウンされました:
>>> import dbus
>>> sys_bus = dbus.SystemBus()
>>> ck_srv = sys_bus.get_object('org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager')
>>> ck_iface = dbus.Interface(ck_srv, 'org.freedesktop.ConsoleKit.Manager')
>>> stop_method = ck_iface.get_dbus_method("Stop")
>>> stop_method()
更新 2:
おそらく理由 67
でなくてもできますか もう少し広い説明に値します。新しい 79
に注目しましょう (82
はもっと複雑で厄介です、私見です)。
99
102
として実行されているサービスです あなたのシステムで:
[email protected]:/tmp$ ps aux|grep console-kit
root 1590 0.0 0.0 1043056 3876 ? Sl Dec05 0:00 /usr/sbin/console-kit-daemon --no-daemon
今、119
単なるメッセージ パッシング システムです。 ConsoleKit などのサービスがある 120
へのインターフェースを公開する .公開されているメソッドの 1 つは、135
です。 (上に示しました)。 ConsoleKit の権限は PolKit で制御されます 、(通常の Linux パーミッションに基づいているにもかかわらず) 「誰が何をできるか」 をより細かく制御できます。 .たとえば、PolKit 「ユーザーがコンピュータにログインしている場合は、何かを行うことを許可します。リモートで接続している場合は、許可しないでください。」 . PolKit の場合 ユーザーが ConsoleKit の呼び出しを許可されていることを確認します の 143
メソッド、そのリクエストは (または を介して) 渡されます ) 152
ConsoleKit へ (その後、コンピュータをシャットダウンします。なぜなら、それは価値があるからです... 161
であるためです )
さらに読む:
- ConsoleKit と PolicyKit とは何ですか?それらはどのように機能しますか?
- ArchWiki PolKit
要約すると、175
でないとコンピュータの電源を切ることはできません。 .ただし、サービスが 184
として実行されていることはわかります システムをシャットダウンします。
更新 3:
元の回答が書かれてから 7 年後の 2021 年 12 月、私はこれをやり直さなければなりませんでした。今回は、Ubuntu 18.04 で。
当然のことながら、状況は少し変わったようです:
- PowerOff 機能は、新しい
198
を介して処理されるようです """new""" (咳! 咳!)の一部であるサービス SystemD 機械 . 203
Python パッケージは非推奨であるか、「レガシー」と見なされているようです。ただし、代わりに使用する新しい PyDbus ライブラリがあります。
したがって、権限のないスクリプトを使用してマシンの電源をオフにすることもできます:
#! /usr/bin/python3
from pydbus import SystemBus
bus = SystemBus()
proxy = bus.get('org.freedesktop.login1', '/org/freedesktop/login1')
if proxy.CanPowerOff() == 'yes':
proxy.PowerOff(False) # False for 'NOT interactive'
アップデート 3.1:
新品ではないようです 思った通り X-D
このまったく同じスレッドに @Roeften による回答が既にあります。
ボーナス :
過熱を防ぐために、時間のかかる作業の後にコンピュータの電源を切りたいとのコメントを読みました...おそらくできることをご存知でしたか? RTCを使用して特定の時間に電源を入れますか? (これとこれを見てください)かなりクールですね。 (これができるとわかったときはとても興奮しました...) :-D
import os
os.system("shutdown now -h")
root 権限でスクリプトを実行します。
<ブロック引用>
権限を昇格せずに...シャットダウンする方法はありますか?
いいえ、ありません (幸いなことに!)。
通常のユーザーの権限昇格を容易にするために、いくつかのシステム機能を使用できることに注意してください。
217
229
238