মনিটর সংযুক্ত থাকলে স্ক্রিপ্ট চালান


13

আমি usr/local/bin/যখন আমার ল্যাপটপের সাথে একটি বাহ্যিক মনিটরকে সংযুক্ত করি তখন আমি সেখানে থাকা স্ক্রিপ্টটি চালানোর চেষ্টা করছি am আমি একটি নতুন 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 ইন্টিগ্রেটেড চিপসেট


আপনি কি বিশেষভাবে এটির মতো করতে চান? একটি ক্ষুদ্র পটভূমি স্ক্রিপ্ট হবে কেক টুকরা।
জ্যাকব ভিলিজম 30'15

@ জ্যাকবভিলিজম স্ক্রিপ্টটি কেমন হবে? আপনি একটি উদাহরণ দেখাতে পারেন?
রুমেশ

(কোনও) দ্বিতীয় মনিটর সংযুক্ত থাকলে কেবল এটিই ট্রিগার করতে পারে?
জ্যাকব ভিলিজম

হ্যাঁ আমি যখন দ্বিতীয় মনিটরটি সংযুক্ত করি তখন আমার নিজের স্ক্রিপ্টটি চালানো দরকার
রুমেশ

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. প্রধান বিভাগে, সংযোগ চালানোর জন্য কমান্ডটি সেট করুন (আমি উদাহরণস্বরূপ "gedit" সেট করি, উদ্ধৃতিগুলি মনে রাখবেন)। এছাড়াও একইভাবে সংযোগ বিচ্ছিন্ন করার জন্য একটি কমান্ড সেট করা সম্ভব। অন্যথায় disconnect_command = ""যেমন আছে তেমনি ছেড়ে দিন ।

    আপনি যদি সংযোগ বিচ্ছিন্ন-আদেশ ব্যবহার করেন তবে লাইনটিও সংঘাতবদ্ধ করুন:

    run_command(disconnect_command)

    এবং লাইনটি মন্তব্য:

    pass

    লিপি হিসাবে ইঙ্গিত

  3. টার্মিনাল থেকে স্ক্রিপ্টটি পরীক্ষা করুন, আপনার স্ক্রিনটি সংযুক্ত করুন এবং দেখুন যে সমস্ত ঠিক আছে কিনা।
  4. যদি সমস্ত ঠিকঠাক কাজ করে তবে এটিকে আপনার প্রারম্ভিক অ্যাপ্লিকেশনগুলিতে যুক্ত করুন: ড্যাশ> স্টার্টআপ অ্যাপ্লিকেশন> কমান্ডটি যুক্ত করুন:

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

    sleep 15ডেস্কটপ সম্পূর্ণরূপে আরম্ভ করার আগে আপনার স্ক্রিপ্ট চালানোর জন্য শুরু হয় করা হয়। ঠিক নিশ্চিত করার জন্য.


সম্পাদনা

স্ক্রিপ্টটি কীভাবে "স্মার্ট" উপায়ে শুরু করবেন।

বিরতি sleep 15সাধারণভাবে কাজ করা উচিত, তবে যেহেতু শুরুর সময় প্রতি সিস্টেমের সময় পৃথক হয় তাই সঠিক বিরতির সময়টি খুঁজে পেতে কিছুটা পরীক্ষা নেওয়া লাগতে পারে take কিছুটা সংযোজন করার সাথে সাথে স্ক্রিপ্টটি "স্মার্ট" হয়ে যায় এবং 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
@ সলসটিসি ১. এটি কোনও সাইকেল নয়, তবে পুরোপুরি কার্যকরী একটি বিকল্প। মনে রাখবেন যে সমস্ত বিজ্ঞপ্তি-, ইভেন্ট- বা যাই হোক না কেন চালিত ক্রিয়াকলাপগুলি কোনওভাবে কোনও ধরণের লুপ চালাচ্ছে। 2. আমি আপনাকে তখন ফেরারি ঠিক করার পরামর্শ দিচ্ছি।
জ্যাকব ভিলিজম

1
স্ক্রিপ্ট চলমান @Rumesh $PATH সঙ্গে ফাইল এক্সটেনশন, এবং সঙ্গে ভাষা পূর্ববর্তী একটি না তাই-মার্জিত সমাধান। আপনি যদি এটি কোনও ব্যবহারকারীর জন্য বা সমস্ত ব্যবহারকারীর জন্য চালাতে চান তবে প্রশ্ন। শেষ ক্ষেত্রে, প্রস্তাবিতের চেয়ে অন্য একটি সেটআপ প্রয়োজন, তবে আপনি পরামর্শ দিচ্ছেন না তবে :)। sleep 15যথেষ্ট না হতে পারে, কিন্তু একটি আরো মার্জিত সমাধান বিরতি "স্মার্ট" করা, দিন স্ক্রিপ্ট ব্যবহার করে দেখুন / আরম্ভ না হওয়া পর্যন্ত প্রারম্ভে প্রক্রিয়া চালানোর জন্য স্ক্রিপ্টের জন্য "প্রস্তুত" ছাড়া হতে পারে। একটি সামান্য সংযোজন হতে হবে। আমাকে জানতে দাও.
জ্যাকব ভিলিজম

1
@Rumesh স্ক্রিপ্ট-এ $PATHভাষা এক্সটেনশন থাকা উচিত নয় এবং এক্সিকিউটেবল হতে, তাই ছাড়াই চালানো python3দেখুন lintian.debian.org/tags/script-with-language-extension.html
জ্যাকব Vlijm

1
@ জ্যাকবভিলিজম আমি ইতিমধ্যে এটি কার্যকর করার জন্য সেট করে রেখেছিলাম তাই আমি অনুমান করি যে আমি কেবল এটি ব্যবহার করতে পারি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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.