GNU/Linux >> Linux の 問題 >  >> Linux

Pythonを使用してコンピューター(Linux)をシャットダウンする

システムをシャットダウンする最善の方法は、次のコードを使用することです

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

Linux
  1. Linuxでのripgrep(rg)コマンドの使用

  2. Linux の Python で、既にペアリングされているものを含め、近くの/検出可能な Bluetooth デバイスを一覧表示します

  3. Linuxコンピューターがスリープ状態になったり、スクリーンセーバーがオンになったりするのをプログラムで防ぐ方法は?

  1. ProcDumpを使用してLinuxをデバッグする

  2. LinuxにPythonをインストールする方法

  3. Linux 2.7 の python を 3.5 に更新

  1. LinuxMint20にPythonをインストールする方法

  2. LinuxでPythonを使用してプロセスがまだ実行されているかどうかを確認するには?

  3. Python for Linux を使用したキー押下イベントのシミュレート