[Exchange and share] DEEPIN V23 网卡远程LAN网络唤醒远程开机断网自动关机远程办公
Tofloor
poster avatar
深圳市耀影科技有限公司
deepin
2023-10-04 10:16
Author

DEEPIN V23 远程唤醒远程开机 LINUX 断网自动关机 远程办公方案 无需公网

  • BIOS支持网络唤醒 设置打开网络唤醒 自行百度自己主板bios是否支持和是否打开
    • 检查计算机硬件是否支持WOL(wake on lan)功能。
      • 检查主板和电源是否支持WOL:

        进入BIOS的Power Management Setup,设置PME Event Wake Up(这其实是一种Wake On PCI Card模式)为 Enabled。注意,有些机器可能为Wake On Lan或Wake On PCI Card。Wake On Lan模式可以在完全关机状态下唤醒,而Wake On PCI Card模式要在深度休眠状态下唤醒。造成这样的区别主要是因为主板的设计不一样,现在的计算机一般都是Wake On PCI Card模式的。

  • deepin 系统步骤
    • 安装工具

    • sudo apt-get install ethtool
      

      image.png

    • 打开深度终端输入ifconfig 找到对应网卡 enp3s0(每个人的网卡名可能不同)

image.png

或者
20200624112150733.png

    • 查看是否开启网络唤醒 sudo ethtool enp3s0 |grep Wake-on
      image.png
      • Wake-on为g代表开启,为d代表关闭
        wake-on各字符的含义:
        d -- 禁用
        p -- 物理活动唤醒
        u -- 单播消息唤醒
        m -- 多播(组播)消息唤醒
        b -- 广播消息唤醒
        a -- ARP 唤醒
        g -- 特定数据包magic packet唤醒
        s -- 设有密码的特定数据包magic packet唤醒
        

设置目标设备为魔术包唤醒模式

设置模式为g 这条命令重启一次后会失效,需要在每次开机时执行一次。

sudo ethtool -s enp3s0 wol g

查看是否成功开启网络唤醒,如果显示结果为下面这样,就表示网卡开启WOL:

sudo ethtool enp3s0 |grep Wake-on

image.png

操作设备发出魔术包

在操作终端安装wol,

wol+目标设备网卡Mac地址即可

设备重启完,网卡的wake-on模式变化解决方法

每次重启完,网卡的Wake-on属性又会恢复到原默认模式,所以每次开机需要再开启,:

    • 使用systemd执行rc.local

在使用了systemd作为启动器的系统(如较新版的deepin)中,默认不包含rc.local文件。此时请在/etc目录下以管理员权限创建一个名为rc.local的纯文本文件,并写入如下内容:

#!/bin/bash
# rc.local config file created by user

# 把你需要执行的命令写在这里
/sbin/ethtool -s enp3s0 wol g
exit 0

保存后,赋予该文件可执行权限:sudo chmod +x /etc/rc.local。下次重启时,systemd就会自动执行rc.local里面的命令了

  • 注意 enp3s0 需要替换为你自己的网卡名字

安装todesk 远程唤醒

电脑端安装todesk

手机控制端-远程开机

找一个旧手机安装todesk,在设置里面打开

image.png

要保证这个旧手机与电脑在同一个路由器里面

也就是这个旧手机要放在电脑家里

这时候我门出门在外面就可以点击这台电脑,会有远程开机的按钮就可以开机啦

如果电脑没有网络呢?自动关机?是的

py代码实现检查网络情况,断网自动关机

新建文本输入以下代码保存为 断网关机.py
把文件放到 /home/“你的用户名“/.config/目录下面

import socket
import os
import time


def check():
    """检查联网"""
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(("114.114.114.110", 80))  # 用链接dns服务器判断是否联网
        s.close()
        return 1
    except:
        s.close()
        return 0


if __name__ == "__main__":
    while 1:
        if not check():
            print("联网失败,再等待5分钟后重新测试")
            time.sleep(5*60)  # 第一次联网失败后等5分钟重新检测
            if not check():  # 又检测失败了
                print("二次联网检查失败,一分钟后关机(倒计时结束前按ctrl+c可结束关机任务)!")
                for i in range(10):
                    print(60-i)
                    time.sleep(1)
                os.system("shutdown now")
        else:
            t = time.localtime()
            t = f"{t.tm_year}-{t.tm_mon}-{t.tm_mday} {t.tm_hour}:{t.tm_min}:{t.tm_sec}"
            print(f"{t}\t联网成功,不关机。")
        time.sleep(1800)  # 30分钟检查一次

编辑 etc/crontab文件,在最后添加,重启

    • 注意最后一行保留那个#,否则会报错 sudo systemctl status cron (
*  *  *  *  * root python /home/HUAWEI/.config/断网关机.py

image.png

因为py文件中有 循环代码,所以定时任务会重复执行如下图

ps -ef | grep ps -ef | grep /home/HUAWEI/.config/断网关机.py

image.png

我们采用给进程枷锁方式

编辑 etc/crontab文件每30分钟执行一次,在最后添加,重启

0  0/30  *  *  * root flock -xn /tmp/test.lock -c "python /home/HUAWEI/.config/断网关机.py >> /home/log/test.log 2>&1"
问题的背景:

我们常常需要通过crontab部署某个脚本运行某些定时任务,但在实际的过程中,一旦处理不好可能导致在同一时刻出现脚本的多个运行副本,比如crontab的调度是每5 分钟运行一次脚本,如果运行的脚本能够在5分钟内处理完任务并退出,则没问题,同一时刻最多只有一个脚本在运行,但如果脚本如果无法在5分钟内处理完任务并退出,则意味着在下一个5分钟,脚本又会被crontab调起来,出现了同一时刻有2个甚至更多的脚本事例在运行,对应一些依赖关系,需要串行处理的脚本来说,可能会导致数据相互覆盖等问题。

为了解决这个问题,脚本必须能够自我保护,即在启动之前判断是否已经有脚本启动了,若当前已经有脚本启动了,则虽然crontab调度到该脚本,但脚本自身会马上退出。

解决问题的思路很多,其中一种比较简便的是:使用文件锁,在linux中,提供了flock命令,具体格式如下:

1,  flock [-sxon] [-w timeout] lockfile [-c]command…

2,  flock [-sxun] [-w timeout] fd
选项:

-s, --shared: 获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock: 移除一个锁,脚本执行完会自动丢弃锁
-n, --nonblock: 如果没有立即获得锁,直接失败而不是等待
-w, --timeout: 如果没有立即获得锁,等待指定时间
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本

锁类型:

共享锁:多个进程可以使用同一把锁,常被用作读共享锁
独占锁:同时只允许一个进程使用,又称排他锁,写锁。

这里我们需要同时只允许一个进程使用,所以使用独占锁。

修改后的定时任务如下:日志为了方便排查问题
---------------------
*  *  *  *  * root flock -xn /tmp/test.lock -c "python /home/HUAWEI/.config/断网关机.py >> /home/log/test.log 2>&1"

sh脚本代码实现检查网络情况,断网自动关机

新建文本输入以下代码保存为 断网关机.sh
把文件放到 /home/“你的用户名“/.config/目录下面断网关机.sh

#!/bin/sh

ping -c 1 223.5.5.5 > /dev/null
ret=$?
if [ $ret -eq 0 ]
then
echo ' 联网正常!'
else
echo ' 网络连接可能无效,5分钟后再次检查! '
sleep 300
fi

#!/bin/sh 第二次检测
ping -c 1 223.5.5.5 > /dev/null
ret=$?
if [ $ret -eq 0 ]
then
echo ' 联网正常! '
else
echo ' 联网失败,1分钟后关闭电脑!  '
shutdown -h +1 
fi

编辑 etc/crontab文件,每30分钟执行一次,在最后添加,重启

0  0/30  *  *  * root /home/HUAWEI/.config/断网关机.sh

添加完重启系统,用以下命令查看状态是否有报错,进行检查

sudo systemctl status cron

参考{注意评论区}

配置中 用户名字段仅在系统级cron(etc/crontab)上可用,而在用户级cron上不可用。
末尾没有添加换行符,在文末按下“ENTER”回车即可,或者保留最后一行一个#

https://wiki.deepin.org/zh/%E5%BE%85%E5%88%86%E7%B1%BB/04_%E6%8C%89%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F%E5%88%92%E5%88%86/02_%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E6%97%B6/%E7%BC%96%E5%86%99%E5%AE%9A%E6%9C%9F%E8%87%AA%E5%8A%A8%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F

在线时间生成http://www.bejson.com/othertools/cron/

分(0-59)  小时(0-23) 日(1-31) 月(1-12) 星期(0-6) 用户	命令 	   说明
    17         * 	   * 	   * 	   * 	  root	[cmd] 	每小时的第 17 分钟以 root 用户权限执行一次 [cmd]
    25         6 	   * 	   * 	   * 	  root	[cmd] 	每天的 6:25 执行 [cmd]
    47         6 	   * 	   * 	   7 	  root	[cmd] 	每星期日的 6:47 执行 [cmd] (星期天用 0 或 7 来表示)
    52         6 	   1 	   * 	   *	  root	[cmd] 	每月1号的 6:52 执行 [cmd]
    */5        * 	   * 	   * 	   * 	  test   ls 	每 5 秒以 test 用户权限执行 ls 命令
    30         3	  10,20    * 	   0 	  test   ls 	每月 10 号及 20 号的 3:30 执行 ls 命令
15,30,45,59    * 	   * 	   * 	   * 	  test   ls 	每隔 15 分钟执行一次 ls
# 作业定义示例:
# .---------------- 分钟(0 - 59
# |  .------------- 小时(0 - 23)
# |  |  .---------- 一个月的某一天(1 - 31)
# |  |  |  .------- 月 (1 - 12) 或 1 月、2 月、3 月、4 月...
# |  |  |  |  .---- 星期几(0 - 6)(星期日=0或7)或星期日、星期一、星期二、星期三、星期四、星期五、星期六
# |  |  |  |  |
# *  *  *  *  * 要执行命令的用户名

鸣谢:群友冯世龙 提供的PY代码

Reply Favorite View the author
All Replies
深圳市耀影科技有限公司
deepin
2023-10-04 10:17
#1
It has been deleted!
深圳市耀影科技有限公司
deepin
2023-10-04 11:06
#2

-https://wiki.deepin.org/zh/%E5%BE%85%E5%88%86%E7%B1%BB/04_%E6%8C%89%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F%E5%88%92%E5%88%86/01_%E7%B3%BB%E7%BB%9F%E8%BD%BD%E5%85%A5%E4%B8%AD/%E7%BC%96%E5%86%99%E8%87%AA%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F

参考 上方位置 在~/.config/autostart目录下添加自启动命令 此方法失效

使用systemd执行rc.local

在使用了systemd作为启动器的系统(如较新版的deepin)中,默认不包含rc.local文件。此时请在/etc目录下以管理员权限创建一个名为rc.local的纯文本文件,并写入如下内容:

#!/bin/bash
# rc.local config file created by user

# 把你需要执行的命令写在这里
/sbin/ethtool -s enp3s0 wol g
exit 0

保存后,赋予该文件可执行权限:sudo chmod +x /etc/rc.local。下次重启时,systemd就会自动执行rc.local里面的命令了

  • 注意 enp3s0 需要替换为你自己的网卡名字

以上方式可以解决开机启动

Reply View the author
fax928
deepin
2023-10-04 15:49
#3

like

Reply View the author
(´◓Д◔`)
deepin
2023-10-05 06:06
#4

好贴agree

Reply View the author
Amz
deepin
2023-10-05 13:30
#5

由于长期在外,刚给我nas配备了ups和向日葵开机棒,我用的ac路由器软件恰好不支持,下一代支持,怎奈何换一下小1000,最后选择了开机棒,这样我的nas安全关机+随时远程开机,安心了免维护

Reply View the author
深圳市耀影科技有限公司
deepin
2023-10-05 22:00
#6
Amz

由于长期在外,刚给我nas配备了ups和向日葵开机棒,我用的ac路由器软件恰好不支持,下一代支持,怎奈何换一下小1000,最后选择了开机棒,这样我的nas安全关机+随时远程开机,安心了免维护

  • 有钱的主 我这个可以免费用
  • 哈哈
  • 其实ESP8266也可以实现
Reply View the author
深圳市耀影科技有限公司
deepin
2024-05-26 17:16
#7
  • 把关机命令替换为,systemctl hibernate,会断网休眠
    • 在启用了swap分区之后,可直接在终端执行 systemctl hibernate

休眠比关闭数据安全,因为有时候远程办公突然断网啦,那没有来的及保存的文档关机就会没有里,那休眠就不会出现这个问题

Reply View the author
树先生tree666
deepin
2024-06-02 16:46
#8

学习了

Reply View the author