不愧是我,短短10分钟就为公司省下了几万块 ( ー̀◡ー́ )

无论家用电脑还是公司的电脑,远程定时开关机都是一个非常实用的功能,只是一般都不太受关注。

我们公司有几台高性能的GPU服务器,每台服务器的功率为2千瓦,这几台服务器持续运行一年,光电费就得大几万

而且长期运行容易加速硬件老化

但是用了远程定时开关机的话,起码能省下一半的电费,也延长了设备的使用寿命!往大了说这是为国家节能减排,往小了说也是为公司降低成本,里外里都是一件好事!

定时开关机是个非常简单又实用的功能,跟着本文用不了10分钟你就能学会如何进行操作!

超简单的定时关机方法

以Windows系统为例,只要在 cmd 命令行中输入下面的 shutdown 命令,在等到设定的超时时间到了之后电脑就会自动关机。

<code># 其中-t后面的参数表示多少秒后开始关机
shutdown -s -t 3600/<code>

在办公条件下,我更推荐使用电脑休眠

相比于关机,休眠模式能保存当前的电脑环境,从而在下次开机后能够瞬间恢复之前的办公环境,大大减少了大家再次打开相关文件或软件的时间。

休眠功能即可以直接通过开始菜单里的电源选项完成,也可以使用 shutdown 命令来完成,如下:

<code>shutdown /h/<code>

配合着 at 命令休眠功能也能实现定时执行。

例如我每天晚上6点下班,接着会让Python执行一段约40分钟的例行任务,然后再休眠电脑,那么我就可以使用下面的命令让电脑每天晚上7点钟自动准时休眠,而不用让人等到7点钟再手动关机啦。

<code>at 19:00 /every:M,T,W,Th,F,S,Su "shutdown /h"/<code>

远程定时开机 Wake on LAN

实现了定时关机之后,还得给电脑定个闹钟,让它“按时起床工作”,这就是远程定时开机功能,主要技术原理是: Wake on LAN技术 (简称WOL),中文叫做“网络唤醒”或者“远端唤醒”。

大概过程就是计算机设备在休眠或关机时主板和网卡上还会保持微弱的供电,网卡仍然会监听局域网内发来的广播包,并对其进行解析,解析后如果发现是符合协议的本机魔法数据包,那么网卡就会通知主板进行系统唤醒,恢复运行状态。

三个步骤实现WOL

第一步 查看网卡是否支持WOL功能

这需要进入到电脑的 BIOS 设置里面,不过不同型号主板的 BIOS 进入和设置方式是千差万别的,所以没有统一的方式,比如有的电脑 BIOS 是在开机时通过 Del 键进入的,有的是通过 F2 键进入的,还有的是通过 Esc 键进入的,所以具体的 BIOS 要具体的研究。

在进入到 BIOS 系统之后,就得在界面上的各种菜单或下拉选项中寻找具有类似 Remote Wake Up 或 Wake on LAN 含义的选项(因为名字并不固定统一,所以词能达意就中了)。

一般情况是在电源管理菜单下,但也有例外,所以需要仔细查找。如果实在找不到的话,说明你的设备不支持WOL技术,等下次换电脑的时候换个好的吧

哈哈。如果找到了,就将选项设置为启用,保存 BIOS 设置并重启进入Windows系统。

其实现在的电脑大部分都是支持这个技术的,不支持的是少数,不同主板的具体设置方式可参考这篇文章进行:http://service.oray.com/question/1331.html

第二步 设置网卡的WOL功能

打开 控制面板 ,依次选择: 查看网络状态和任务 → 更改适配器设置 → 物理网卡 (网卡可能比较多,注意不要选错了,一般选择那个Intel开头的,因为它是实际的有线物理网卡)。

然后 右键 所选物理网卡,选择 属性 ,弹出 以太网属性设置窗口 ,再点击 配置 按钮进入 网络适配器属性设置窗口 ,将 高级 面板下面的 唤醒魔包 属性值设置为 启用

再将电源管理面板中的允许此设备唤醒计算机选项勾选

完成上述操作之后,还要记录下网卡的MAC地址(也称为网卡的物理地址)以备下一步使用:

操作方法就是双击刚才的物理网卡,弹出以太网状态窗口,点击其中的详细信息,那么就可以看到网卡对应的MAC地址了,Ctrl+c复制下来就可以了。



第三步 远程发送魔法数据包唤醒机器

这一步在一些路由器、电脑软件、手机APP中其实是可以实现的,但不是太灵活,所以这里教大家一个通过Python程序来实现的方法,这样也方便大家在我代码的基础上进行定制化扩展或者增强。

首先,保证要唤醒的各个电脑电源都是开着的状态,并且保证其中一台是运行且联网的状态。

电脑资源紧张的同学,可以参考我们之前的文章 《在手机上装Python》 通过安卓手机配置Python环境。

将这台电脑作为集中控制器,因为要由它来统一往别的电脑发送魔法数据包。详细的代码如下,脚本名为wol.py,大家只要修改和添加MAC地址列表中的就可以正常使用了。

<code> # 导入所需模块


import socket, binascii

# 所有要远程定时开机电脑的MAC地址列表,注意要去掉MAC地址中的 - 符号
pc_mac_list = ['A08000000365',
'A08000000365',
'A08000000366',
'A08000000367',
'A08000000368',
'A08000000369',
'A08000000370']

def create_magic_packet(mac):
"""
根据目标主机的MAC地址创建一个魔法数据包
"""
data = 'FF' * 6 + mac * 16
send_data = binascii.unhexlify(data)
return send_data

def send_magic_packet(send_data):
"""
通过socket向目标主机广播魔法数据包
"""
broadcast_address = '255.255.255.255'
port = 9
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto(send_data, (broadcast_address, port))

if __name__ == '__main__':
# 遍历MAC地址列表,分别构造和发送魔法数据包
for i in pc_mac_list:
send_data = create_magic_packet(i)
send_magic_packet(send_data)
print('向%s主机发送魔法唤醒包成功,请稍等片刻后查看主机是否开启!' % i)/<code>

最后我们将wol.py部署到集中控制器上,假设我们每天早上9点上班,那么我们就可以使用 crontab 设置每天早上8:30执行远程开机,对应的 crontab 设置如下,大家可以参考:

<code> 30 8 * * * python3 wol.py/<code>

更进一步,如果有条件的话,结合远程Jupyter工具一起使用,能够实现随时在家远程开关机,效果更佳顶呱呱。

Jupyter 感兴趣的同学欢迎在留言区留言,有机会将向大家详细介绍


本文作者:博海,一个沉迷于技术并且追求艺术的pythoner,欢迎与我交流(微信号:bohy_i)。