use*_*859 15 python linux system-shutdown python-2.7
我正在尝试编写一个脚本,如果命令填充了一些要求,将关闭计算机
os.system("poweroff")
Run Code Online (Sandbox Code Playgroud)
也试过了
os.system("shutdown now -h")
Run Code Online (Sandbox Code Playgroud)
还有其他几个.但是当我运行它时没有任何反应,计算机通过代码而不会崩溃或产生任何错误消息并正常终止脚本,而无需关闭计算机.
如何在python中关闭计算机?
编辑:
似乎我尝试过的命令需要root访问权限.有没有办法在没有提升权限的情况下从脚本关闭机器?
Rah*_*obi 20
import os
os.system("shutdown now -h")
Run Code Online (Sandbox Code Playgroud)
使用root权限执行脚本.
Bor*_*jaX 20
许多Linux发行版在那里需要超级用户权限执行shutdown
或者halt
,不过呢,怎么来,如果你坐在你的电脑上,你可以将其关闭而不根?嗯......这背后的想法是,如果你有物理访问计算机,你几乎可以拉电源线并关闭电源,所以现在,许多发行版允许关闭电源虽然访问本地系统总线可访问通过root
.问题dbus
(或通过它暴露的服务,而不是)?它在不断变化.我建议安装一个dbus查看器工具,如D-feet(建议:它仍然很难想象,但它可能有帮助)
看看这些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()
Run Code Online (Sandbox Code Playgroud)
这适用于Ubuntu 12.04(我刚刚关闭计算机以确保它有效).如果你有更新的东西......好吧,它可能不起作用.这是该方法的缺点:它是非常分布的.
您可能必须安装该dbus
软件包才能工作(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()
Run Code Online (Sandbox Code Playgroud)
更新2:
可能为什么你能做到这一点而不dbus-python
值得更广泛的解释.让我们专注于更新的root
(ConsoleKit
更复杂和混乱,恕我直言).
这HAL
是一个ConsoleKit
在您的系统中运行的服务:
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
Run Code Online (Sandbox Code Playgroud)
现在,root
它只是一个消息传递系统.您有一个服务,例如公开接口的ConsoleKitd-bus
.暴露的方法之一是d-bus
(如上所示).使用PolKit控制ConsoleKit的权限,尽管它基于常规的Linux权限,但它为"谁可以做什么"提供了更好的控制.例如,PolKit可以说"如果用户登录到计算机,然后允许他做某事.如果它是远程连接的,那么就不要." .如果PolKit确定允许您的用户调用ConsoleKit的方法,那么该请求将通过(或通过)传递给ConsoleKit(随后它将关闭您的计算机,因为它可以...因为它值得...因为它是)Stop
Stop
d-bus
进一步阅读:
总结一下:如果没有,你就无法关闭电脑root
.但是,您可以告诉正在运行的服务,root
以便为您关闭系统.
奖金:
我在你的意见,你想关闭计算机耗时的任务,以防止过热一段时间后一个读......你知道吗,你可以很可能在使用RTC指定时间接通电源?(看到这个和这个)很酷,呃?(当我发现我能做到这一点时,我非常兴奋...):- D
归档时间: |
|
查看次数: |
34535 次 |
最近记录: |