Monitör bağlandığında komut dosyasını çalıştır


13

usr/local/bin/Dizüstü bilgisayarıma harici bir monitör bağladığınızda bulunan bir komut dosyasını çalıştırmaya çalışıyorum . Yeni bir udevkural eklemeye çalıştım ama bu işe yaramadı. Ben yeni bir dosya oluşturdu /etc/udev/rules.ddenir vga-monitor-connect.rules. Dosyanın içeriği

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

Bu cevaptan çizgiyi aldım

Çevrimiçi arama yaptıktan sonra aşağıdaki kuralı da denedim

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

Ancak bu da işe yaramadı.

Komut dosyasını el ile çalıştırdım ve komutumla ilgili bir sorun olmadığı için çalıştığını doğrulayabilirim.

Ayrıca çok fazla bilmediğimi açıklığa kavuşturmak udevistiyorum ki kullandığım kural yanlış olabilir. Sorunum için uygun kuralı bilen biri varsa, lütfen bir cevap bırakın.

Grafik kartım Intel GM965 tümleşik yonga seti


Özellikle böyle yapmak ister misiniz? Küçük bir arka plan komut dosyası çok kolay olurdu.
Jacob Vlijm

@JacobVlijm Senaryo nasıl olurdu? Bir örnek gösterebilir misin?
Rumesh

Sadece (varsa) ikinci monitör takılıysa tetiklemek mi?
Jacob Vlijm

Evet, ikinci monitörü
taktığımda

1
Sorun değil, acele etmeyin ve mümkün
olduğunca

Yanıtlar:


7

Bir ekran bağlı veya bağlı değilse bir komut çalıştırmanın alternatif bir yolu

Alternatif bir çözüm, küçük bir arka plan komut dosyası çalıştırmak olacaktır. Aşağıdaki betiği arka planda çalıştırarak, işlemci yükündeki herhangi bir artışı ölçemedim.

İkinci bir ekran bağlandığında veya bağlantısı kesildiğinde bir komut dosyasını veya başka bir komutu çalıştırmanın kolay ve kolay bir yoludur.

Örnek komut dosyası

  • Sadece her beş saniyede bir komutun çıktısında "bağlı" dizesinin kaç kez oluştuğunu kontrol eder xrandr("bağlantı kesildi" ile yanlış eşleşmeleri önlemek için "bağlandıktan" sonraki boşluğa dikkat edin). Her olay bağlı bir ekranı temsil eder.
  • Olay sayısı değişirse, bir ekran bağlandı veya bağlantısı kesildi. Değişiklik kod tarafından "fark edilir" ve bir komuta bağlanabilir, senaryonun baş bölümünde ayarlayabilirsiniz.

Senaryo

#!/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

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya kopyalayın, connect_screen.py
  2. Kafa bölümünde, connect üzerinde çalışmak için komutu ayarlayın (Örnek olarak "gedit" i ayarladım, tırnaklara dikkat edin). Aynı zamanda bağlantı kesilmesi için de bir komut ayarlamak mümkündür. Başka disconnect_command = ""olduğu gibi bırakın .

    Eğer bir disconnect- komutunu kullanıyoruz, ayrıca satırı:

    run_command(disconnect_command)

    ve satırı yorumlayın:

    pass

    Kodda belirtildiği gibi

  3. Komut dosyasını bir terminalden test edin, ekranınızı bağlayın ve hepsinin iyi çalışıp çalışmadığına bakın.
  4. Her şey yolunda giderse, başlangıç ​​uygulamalarınıza ekleyin: Dash> Startup Applications> Komut ekle:

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

    sleep 15Komut çalıştırmak başlamadan önce masaüstü tamamen başlatmak yapmaktır. Sadece emin olmak için.


DÜZENLE

"Akıllı" bir şekilde başlangıçta komut dosyası nasıl çalıştırılır.

Mola sleep 15genel olarak çalışmalıdır, ancak başlatma süresi sisteme göre farklılık gösterdiğinden, doğru mola süresini bulmak biraz deneme gerektirebilir. Küçük bir ekleme ile komut dosyası "akıllı" olur ve xrandrkomutun gerçek komut dosyasını başlatmadan önce başarılı olmasını bekler . Aşağıdaki sürümü kullanırsanız, yalnızca komutu eklemeniz gerekir:

python3 /path/to/connect_screen.py

Başlangıç ​​Uygulamalarınıza. Daha fazla kullanım yukarıdaki sürümle tamamen aynıdır.

Senaryo

#!/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

4
Arabayı tamir etmek yerine hızlı bir araba kırılmış bir adama bisiklet veriyorsunuz ...
solsTiCe

1
@solsTiCe 1. Bu bisiklet değil, mükemmel işlevsel bir seçenek. Bir şekilde bir döngü yürütmek için tüm bildirimlerin, olayların veya her tür güdümlü eylemin mevcut olduğunu unutmayın . 2. O zaman Ferrari'yi düzeltmenizi öneririm.
Jacob Vlijm

1
Komut dosyaları çalıştıran @Rumesh $PATH ile dosya uzantısı ve birlikte dil önceki bir çok da şık değil çözümdür. Soru, bir kullanıcı için mi yoksa tüm kullanıcılar için mi çalıştırmak istediğinizdir. Son durumda, önerilenden başka bir kurulum gereklidir, ancak tercihen önerdiğiniz kurulum değildir :). Bu sleep 15yeterli olmayabilir, ancak daha şık bir çözüm mola "akıllı" yapmak olabilir, komut dosyası çalıştırmak için başlatma prosedürü "hazır" olana kadar komut dosyası başlatmak için deneyin / hariç bırakın. Küçük bir ekleme olurdu. Bilmeme izin ver.
Jacob Vlijm

1
İçinde @Rumesh komut $PATHdil uzantısına sahip ve yürütülebilir olmamalı, böylece olmadan çalıştırmak python3bkz lintian.debian.org/tags/script-with-language-extension.html
Jacob Vlijm

1
@JacobVlijm Daha önce çalıştırılabilir olmasını ayarlamıştım, bu yüzden sadece kullanabilirimconnect_screen
Rumesh

2

Bu, aşağıdaki bash betiğinden de elde edilebilir.

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.