连接监视器时运行脚本

连接监视器时运行脚本

当我将外接显示器连接到笔记本电脑时,我尝试运行位于的脚本usr/local/bin/。我尝试添加新udev规则,但没有成功。我在中创建了一个/etc/udev/rules.d名为的新文件vga-monitor-connect.rules。文件内容为

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/panel-fix"

我接了这个答案

在网上搜索后,我也尝试了以下规则

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/rumesh/.Xauthority", RUN+="/usr/local/bin/panel-fix"

但这也不起作用。

我已经手动运行了该脚本,并且可以确认它有效,所以这不是我的脚本的问题。

我还想澄清一下,我对此了解不多,udev所以我使用的规则可能是错误的。如果有人知道适合我问题的规则,请留下答案。

我的显卡是英特尔 GM965 集成芯片组

答案1

在屏幕连接或断开连接时运行命令的另一种方法

另一种解决方案是运行一个小型后台脚本。在后台运行下面的脚本,我无法测量处理器负载的任何增加。

无论何时连接或断开第二个屏幕,这都是运行脚本或任何其他命令的简单便捷方法。

示例脚本

  • 每五秒检查一次命令输出中字符串“connected”出现的次数xrandr(注意“connected”后面的空格,以防止与“disconnected”错误匹配)。每次出现都代表一个已连接的屏幕。
  • 如果发生次数发生变化,则表示屏幕已连接或已断开连接。脚本会“注意到”此变化,并且可以将其连接到命令,您可以在脚本的头部部分进行设置。

剧本

#!/usr/bin/env python3
import subprocess
import time

#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---

def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])

# first count
xr1 = None

while True:
    time.sleep(5)
    # second count
    xr2 = count_screens(get(["xrandr"]))
    # check if there is a change in the screen state
    if xr2 != xr1:
        print("change")
        if xr2 == 2:

            # command to run if connected (two screens)
            run_command(connect_command)
        elif xr2 == 1:
            # command to run if disconnected (one screen)
            # uncomment run_command(disconnect_command) to enable, then also comment out pass
            pass
            # run_command(disconnect_command)
    # set the second count as initial state for the next loop
    xr1 = xr2

如何使用

  1. 将脚本复制到一个空文件中,另存为connect_screen.py
  2. 在 head 部分,设置连接时运行的命令(我以“gedit”为例,请注意引号)。同样,也可以在断开连接时设置命令。否则保持disconnect_command = ""原样。

    如果如果您确实使用了 disconnect- 命令,也请取消注释该行:

    run_command(disconnect_command)
    

    并注释掉以下行:

    pass
    

    如脚本所示

  3. 从终端测试运行脚本,连接屏幕并查看一切是否正常。
  4. 如果一切正常,请将其添加到您的启动应用程序中:Dash>启动应用程序>添加命令:

    /bin/bash -c "sleep 15&&python3 /path/to/connect_screen.py"
    

    sleep 15是为了让桌面在脚本开始运行之前完全启动。只是为了确保万无一失。


编辑

如何以“智能”方式在启动时运行脚本。

的中断sleep 15通常应该可以工作,但由于每个系统的启动时间不同,可能需要进行一些实验才能找到正确的中断时间。只需添加一点,脚本就会变得“智能”,并等待命令xrandr成功后再启动实际脚本。如果您使用以下版本,则只需添加命令:

python3 /path/to/connect_screen.py

添加到您的启动应用程序。进一步的使用方法与上面的版本完全相同。

剧本

#!/usr/bin/env python3
import subprocess
import time

#--- set both commands (connect / disconnect) below
connect_command = "gedit"
disconnect_command = ""
#---

while True:
    time.sleep(5)
    try:
        subprocess.Popen(["xrandr"])
    except:
        pass
    else:
        break


# function to get the output of xrandr
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
# - to count the occurrenc of " connected "
def count_screens(xr): return xr.count(" connected ")
# - to run the connect / disconnect command(s)
def run_command(cmd): subprocess.Popen(["/bin/bash", "-c", cmd])

# first count
xr1 = None

while True:
    time.sleep(5)
    # second count
    xr2 = count_screens(get(["xrandr"]))
    # check if there is a change in the screen state
    if xr2 != xr1:
        if xr2 == 2:
            # command to run if connected (two screens)
            run_command(connect_command)
        elif xr2 == 1:
            # command to run if disconnected (one screen)
            # uncomment run_command(disconnect_command) to enable, then also comment out pass
            pass
            # run_command(disconnect_command)
    # set the second count as initial state for the next loop
    xr1 = xr2

答案2

这也可以通过以下 bash 脚本实现。

#!/usr/bin/env bash

xrandr=$(xrandr)

con_monitors=$(echo $xrandr | grep -c " connected ")

    if [[ $con_monitors -gt 1 ]]; then
        # All the layouts are saved in "screenlayout" folder.
        # eg cmd. xrandr --output HDMI-1 --mode 2560x1440 --pos 0x0 --rotate normal --output DP-1 --off --output eDP-1 --primary --mode 1920x1080 --pos 283x1440 --rotate normal --output DP-2 --off
        for layout in ~/.screenlayout/*.sh; do
            ./layout
        done
    fi

相关内容