سؤال تشغيل البرنامج النصي عند توصيل جهاز العرض


أحاول تشغيل برنامج نصي موجود في 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 لذلك قد تكون القاعدة التي استخدمتها خاطئة. إذا كان أي شخص يعرف القاعدة المناسبة لمشكلتي ، يرجى ترك إجابة.

بطاقة الرسومات الخاصة بي هي مجموعة شرائح Intel GM965 المدمجة


11
2018-05-30 10:29


الأصل


هل تريد على وجه التحديد أن تفعل ذلك مثل هذا؟ سيناريو خلفية صغيرة سيكون قطعة من الكعكة. - Jacob Vlijm
@ JacobVlijm كيف سيكون السيناريو؟ هل يمكن أن تظهر مثالا. - Rumesh
هل هو فقط لتحريك إذا كان (أي) جهاز العرض الثاني مرفقاً؟ - Jacob Vlijm
نعم ، أحتاج إلى تشغيل البرنامج النصي الخاص بي عند إرفاق جهاز العرض الثاني - Rumesh
لا مشكلة ، خذ وقتك وإجابتك عندما يمكنك :) - Rumesh


الأجوبة:


طريقة بديلة لتشغيل أمر إذا كانت الشاشة متصلة أو غير متصلة

الحل البديل هو تشغيل برنامج نصي صغير. تشغيل البرنامج النصي أدناه في الخلفية ، لم أستطع قياس أي زيادة في تحميل المعالج أيا كان.

إنها طريقة سهلة وسهلة لتشغيل برنامج نصي ، أو أي أمر آخر ، كلما تم توصيل شاشة ثانية أو فصلها.

البرنامج النصي المثال

  • يفحص ببساطة كل خمس ثوانٍ عدد مرات حدوث السلسلة "المتصلة" في إخراج الأمر 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. في قسم الرأس ، اضبط الأمر للتشغيل عند الاتصال (أعددت "gedit" كمثال ، ضع في اعتبارك علامات الاقتباس). كما أنه من الممكن ضبط الأمر عند قطع الاتصال ، بالمثل. آخر إجازة disconnect_command = "" كما هو.

    إذا أنت تستخدم أمر قطع الاتصال ، وكذلك إلغاء ربط الخط:

    run_command(disconnect_command)
    

    والتعليق على الخط:

    pass
    

    كما هو موضح في البرنامج النصي

  3. اختبر النص البرمجي من جهاز طرفي ، وصّل شاشتك واعرف ما إذا كان كل شيء يعمل بشكل جيد.
  4. إذا كان كل شيء يعمل بشكل جيد ، قم بإضافته إلى تطبيقات بدء التشغيل: Dash> Startup Applications> Add the command:

    /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

7
2018-05-30 18:11



كنت تعطي دراجة لرجل مع سيارة سريعة مكسورة بدلا من إصلاح السيارة ... - solsTiCe
solsTiCe 1. هذه ليست دراجة ، ولكن خيار وظيفي تماما. لا تنسى الكل إعلام - أو حدث أو أي إجراءات مدفوعة موجودة لتشغيل نوع من حلقة بطريقة أو بأخرى. 2. أقترح عليك إصلاح الفيراري بعد ذلك. - Jacob Vlijm
يعمل البرنامج النصي بشكل رائع - Rumesh
@ Rumesh scripts in $PATH لا ينبغي أن يكون تمديد لغة وتكون قابلة للتنفيذ ، حتى تشغيل دون python3 نرى lintian.debian.org/tags/script-with-language-extension.html - Jacob Vlijm
JacobVlijm كنت قد حددت بالفعل لتكون قابلة للتنفيذ قبل ذلك أعتقد أنني يمكن أن تستخدم فقط connect_screen - Rumesh