shutdown
世の中にある Linux ディストリビューションの多くは、またはを実行するためにスーパー ユーザー権限を必要とhalt
します。メニューを開き、Shutdownを押すと、 にならずにシャットダウンしますよroot
ね?
ええと...これの背後にある理論的根拠は、コンピューターに物理的にアクセスできる場合、電源コードを引っ張ってとにかく電源を切ることができるということです.を通してdbus
。dbus
(またはそれを介して公開されているサービス)に問題がありますか?それは絶えず変化しています。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 で動作します (動作を確認するためにコンピューターの電源をオフにしました)。新しいものをお持ちの場合...まあ、うまくいかないかもしれません。これは、この方法の欠点です。ディストリビューション固有です。
dbus-python
これを機能させるには、パッケージをインストールする必要がある場合があります ( 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:
おそらく、もう少し広い説明に値することなく、なぜこれを行うことができるのでしょうか。root
新しいものに焦点を当てましょうConsoleKit
(HAL
もっと複雑で面倒です、IMHO)。
これは、システムでConsoleKit
実行されているサービスです。root
borrajax@borrajax:/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
現在、d-bus
単なるメッセージパッシングシステムです。へのインターフェイスを公開するConsoleKitなどのサービスがありますd-bus
。公開されているメソッドの 1 つがStop
(上に示されている) です。ConsoleKitのパーミッションはPolKitで制御されます。これは (通常の Linux パーミッションに基づいているにもかかわらず) 「誰が何をできるか」をより細かく制御できます。たとえば、PolKitは、「ユーザーがコンピューターにログインしている場合は、何かを実行できるようにします。リモートで接続されている場合は、許可しないでください」などと言うことができます。. PolKitが、ユーザーがConsoleKitの呼び出しを許可されていると判断した場合Stop
メソッドを使用すると、その要求はConsoleKitによって (またはを介して)渡されます (その後、コンピュータがシャットダウンされます。d-bus
root
参考文献:
要約すると、コンピュータの電源を切ることはできませんroot
。ただし、実行中のサービスroot
にシステムをシャットダウンするように指示することはできます。
更新 3:
元の回答が書かれてから 7 年後の 2021 年 12 月、私はこれをやり直さなければなりませんでした。今回は、Ubuntu 18.04 で。
当然のことながら、状況は少し変わったようです。
したがって、特権のないスクリプトを使用してマシンの電源を切ることができます。
#! /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:
思ったほど新しくはないようだXD
このまったく同じスレッドで@Roeftenによる回答がすでにあります。
ボーナス:
過熱を防ぐために、時間のかかる作業の後にコンピューターの電源を切りたいとのコメントを読みました... RTC を使用して、特定の時間に電源を入れることができることをご存知でしたか? (これとこれを見てください)かなりクールですね。(これができるとわかったときはとても興奮しました...) :-D