मॉनिटर कनेक्ट होने पर स्क्रिप्ट चलाएँ


13

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 एकीकृत चिपसेट है


क्या आप विशेष रूप से इसे इस तरह करना चाहते हैं? एक छोटी पृष्ठभूमि स्क्रिप्ट केक का एक टुकड़ा होगी।
जैकब व्लिजम

@JacobVlijm स्क्रिप्ट कैसी होगी? क्या आप एक उदाहरण दिखा सकते हैं।
रमेश

क्या केवल ट्रिगर करना है अगर (कोई) दूसरा मॉनिटर संलग्न है?
जैकब व्लिजम

हां, जब मुझे दूसरा मॉनीटर संलग्न करना हो तो मुझे अपनी स्क्रिप्ट चलाने की आवश्यकता है
रमेश

1
कोई बात नहीं, अपना समय ले लो और जवाब दो जब आप कर सकते हैं :)
रमेश

जवाबों:


7

एक कमांड चलाने का एक वैकल्पिक तरीका अगर एक स्क्रीन जुड़ा हुआ है या डिस्कनेक्ट हो गया है

एक वैकल्पिक समाधान एक छोटे पृष्ठभूमि स्क्रिप्ट को चलाने के लिए होगा। पृष्ठभूमि में नीचे की स्क्रिप्ट को चलाने से, मैं प्रोसेसर लोड में कोई वृद्धि नहीं माप सकता।

जब भी कोई दूसरी स्क्रीन कनेक्ट या डिस्कनेक्ट की जाती है, तो स्क्रिप्ट, या किसी अन्य कमांड को चलाना एक आसान तरीका है।

उदाहरण लिपि

  • बस हर पांच सेकंड में जांचता है कि कमांड के आउटपुट में स्ट्रिंग "कनेक्टेड" कितनी बार होती है xrandr("डिस्कनेक्ट किए गए" के साथ झूठे मैचों को रोकने के लिए "कनेक्ट" के बाद की जगह को ध्यान में रखें)। प्रत्येक घटना एक कनेक्टेड स्क्रीन का प्रतिनिधित्व करती है।
  • यदि आवृत्तियों की संख्या में परिवर्तन होता है, तो या तो स्क्रीन कनेक्ट या डिस्कनेक्ट हो गई थी। परिवर्तन स्क्रिप्ट द्वारा "देखा गया" है और इसे एक कमांड से जोड़ा जा सकता है, आप स्क्रिप्ट के मुख्य भाग में सेट कर सकते हैं।

लिपी

#!/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. हेड सेक्शन में, कनेक्ट को चलाने के लिए कमांड सेट करें (मैं एक उदाहरण के रूप में "जीडिट" सेट करता हूं, उद्धरणों को ध्यान में रखता हूं)। इसके अलावा डिस्कनेक्ट पर एक कमांड सेट करना संभव है, इसी तरह। disconnect_command = ""जैसा है वैसा ही छोड़ दें ।

    यदि आप डिस्कनेक्ट-कमांड का उपयोग करते हैं, तो लाइन को भी अनकम्प्लिमेंट करें:

    run_command(disconnect_command)

    और लाइन पर टिप्पणी करें:

    pass

    जैसा कि स्क्रिप्ट में दिखाया गया है

  3. किसी टर्मिनल से स्क्रिप्ट का परीक्षण करें, अपनी स्क्रीन से कनेक्ट करें और देखें कि क्या सब ठीक है।
  4. यदि सब ठीक काम करता है, तो इसे अपने स्टार्टअप एप्लिकेशन में जोड़ें: डैश> स्टार्टअप एप्लिकेशन> कमांड जोड़ें:

    /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

4
आप कार को ठीक करने के बजाय एक टूटी हुई तेज कार के साथ एक आदमी को एक साइकिल दे रहे हैं ...
solsTiCe

1
@solsTiCe 1. यह कोई साइकिल नहीं है, लेकिन एक पूरी तरह से कार्यात्मक विकल्प है। ध्यान रखें कि सभी अधिसूचित-, घटना- या जो भी संचालित क्रियाएं किसी तरह के लूप को चलाने से होती हैं। 2. मेरा सुझाव है कि आप फेरारी को ठीक कर लें।
जैकब व्लिजम

1
@ उमेश फ़ाइल एक्सटेंशन के $PATH साथ स्क्रिप्ट चला रहा है , और पूर्ववर्ती भाषा के साथ यह एक बहुत ही सुंदर समाधान नहीं है। सवाल यह है कि क्या आप इसे एक उपयोगकर्ता के लिए या सभी उपयोगकर्ताओं के लिए चलाना चाहते हैं। अंतिम स्थिति में, सुझाए गए की तुलना में एक और सेटअप की आवश्यकता है, लेकिन अधिमानतः आप जो सुझाव नहीं दे रहे हैं :)। sleep 15पर्याप्त नहीं हो सकता है, लेकिन एक और अधिक सुरुचिपूर्ण समाधान तोड़ "स्मार्ट" बनाने के लिए, चलो स्क्रिप्ट ट्राई / शुरू करने तक स्टार्टअप प्रक्रिया चलाने के लिए स्क्रिप्ट के लिए "तैयार" है सिवाय हो सकता है। WOuld एक मामूली जोड़ हो। मुझे बताएं।
जैकब व्लिजम

1
@Rumesh स्क्रिप्ट में $PATHभाषा का विस्तार नहीं होना चाहिए और निष्पादन योग्य नहीं होना चाहिए, इसलिए बिना python3देखें lintian.debian.org/tags/script-with-language-extension.html
याकूब Vlijm

1
@JacobVlijm मैंने पहले ही इसे क्रियान्वित करने के लिए सेट कर दिया था, इसलिए मुझे लगता है कि मैं सिर्फ उपयोग कर सकता हूंconnect_screen
रूमेश

2

निम्नलिखित बैश स्क्रिप्ट से भी इसे प्राप्त किया जा सकता है।

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.