কোনও উদেব নিয়ম থেকে বিজ্ঞপ্তি-প্রেরণ কল করুন


13

আমি লিনাক্স মিন্ট 13 মেট ব্যবহার করি এবং আমি ডিভাইসগুলি প্লাগ / আনপ্লাগ করার সময় বিজ্ঞপ্তিগুলি সেট আপ করার চেষ্টা করছি।

প্রথমত, আমি udev-notify প্যাকেজটি পেয়েছি , তবে দুর্ভাগ্যক্রমে এটি আমার পক্ষে প্রায়শই কার্যকর হয় না: এটি খুব অল্প সময়ের জন্য (1-2 মিনিট) কাজ করে এবং তারপরে, আমি যদি কোনও ডিভাইস সংযোগ / সংযোগ বিচ্ছিন্ন করি তবে এটি ক্র্যাশ হয়ে যায়:

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files

আমি কোনও সমাধান পাইনি, সুতরাং আমাকে এটি সরিয়ে ফেলতে হয়েছিল। (দায়ের করা বাগ্রেপোর্ট )

অবাক করে বলা যায়, আমি এখন পর্যন্ত খুঁজে পাইনি এমন কোনও ইউটিলিটি নেই। তারপরে আমি ইউদেব বিধিগুলি লেখার চেষ্টা করেছি যা সমস্ত ডিভাইসের সাথে মেলে। আমি নতুন ফাইল যুক্ত করেছি /etc/udev/rules.d/notify.rules:

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"

এবং দুটি স্ক্রিপ্ট:

device_plug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &

device_unplug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &

এটি কাজ করে, তবে এটি খুব বোবা কাজ করে। আমার প্রশ্নগুলি হ'ল:

  1. সংযুক্ত ডিভাইসের প্রকৃত শিরোনাম কীভাবে পাওয়া যায়, lsusbআউটপুটে আমি দেখতে পাচ্ছি তার মতোই ? বর্তমানে, আমি কেবল "প্লাগড" এবং "প্লাগড" এর মতো বিজ্ঞপ্তি পেয়েছি এবং আমার উদেব নিয়মে আমি কীভাবে ডিভাইসটির নামটি পুনরুদ্ধার করতে পারি তা খুঁজে পাচ্ছি না (যদি আমি পারতাম তবে আমি এটি আমার স্ক্রিপ্টে এটি হিসাবে প্রেরণ করব) প্যারামিটার)
  2. বর্তমানে, অনেকগুলি বিজ্ঞপ্তি সক্রিয় করা হয়েছে। বলুন, আমি যখন আমার ইউএসবি স্টিকটি সংযুক্ত করি তখন আমি প্রায় 15 টি বিজ্ঞপ্তি পেয়েছি! তবে, যদি আমি চালনা করি তবে lsusbসংযুক্ত ইউএসবি স্টিকটি কেবলমাত্র একক ডিভাইস হিসাবে প্রদর্শিত হয়। সুতরাং, ফিল্টার নিয়মের জন্য আমার আরও কিছু যুক্তি যুক্ত করা উচিত বলে মনে হচ্ছে, তবে আমি এটি খুঁজে পাচ্ছি না।
  3. সম্ভবত ডিভাইস প্লাগ / আনপ্লাগ নোটিফিকেশনের আরও কিছু ভাল সমাধান আছে? কিছু জানা থাকলে দয়া করে পরামর্শ দিন।

উত্তর:


9

ঠিক আছে, বহু ঘন্টা গুগল করা এবং ফোরামে জিজ্ঞাসা করার পরে, আমি এটি কাজ করেছিলাম (মনে হয়)। কিছু ইউএসবি ডিভাইস প্লাগ করা / প্লাগ লাগানো অবস্থায় যে কেউ দুর্দান্ত ভিজ্যুয়াল এবং / অথবা অডিও বিজ্ঞপ্তি পেতে চায় সে আমার স্ক্রিপ্টটি ইনস্টল করতে পারে, নীচে ইনস্টলেশন সংক্রান্ত বিশদটি দেখুন।

সবার আগে আমার নিজের প্রশ্নের উত্তর দিন।

1. সংযুক্ত ডিভাইসের প্রকৃত শিরোনাম কীভাবে পাওয়া যায়, lsusbআউটপুটে আমি দেখতে পাচ্ছি ?

কার্নেলে এ জাতীয় কোনও শিরোনাম নেই (সাধারণ ক্ষেত্রে)। অনেক জোড়া শিরোনাম সহ একটি ডাটাবেস ফাইল রয়েছে vendor_id:product_id, এটি সাধারণত /usr/share/hwdata/usb.idsফাইল হয়। এই ডাটাবেস দ্বারা আপডেট করা যেতে পারে /usr/sbin/update-usbids.sh। এই তথ্যের জন্য linux.org.ru থেকে বলছি ধন্যবাদ ।

জোড়ায় ডিভাইসের শিরোনাম পাওয়ার জন্য কোনও বিশেষ সরঞ্জাম আছে কিনা আমি জানি না vendor_id:product_id, তাই আমাকে কিছুটা হ্যাক করতে হয়েছিল lsusbএবং grep: উদাহরণস্বরূপ,lsusb | grep '0458:003a'

২. বর্তমানে, অনেকগুলি বিজ্ঞপ্তি সক্রিয় করা হয়েছে। বলুন, আমি যখন আমার ইউএসবি স্টিকটি সংযুক্ত করি তখন আমি প্রায় 15 টি বিজ্ঞপ্তি পেয়েছি!

আমি অবশ্যই স্বীকার করতে পারি যে আমি এটির জন্য কীভাবে বিধি লিখতে পারি তা বুঝতে পারি নি, তবে এটির ফিল্টার করার জন্য আমি আরও একটি উপায় খুঁজে পেয়েছি।

udevআমাদের কিছু বিকল্প ব্যবহার করার অনুমতি দেয় RUN+="...": বলুন, আমরা যথাক্রমে $attr{busnum}এবং $attr{devnum}যথাক্রমে বাস নম্বর এবং ডিভাইস নম্বর পেতে পারি । প্রথমত, আমার স্ক্রিপ্টে আমি বিশেষ ফাইলে সংযুক্ত ডিভাইসের তালিকা সঞ্চয় করি, যাতে স্ক্রিপ্টটি যদি নতুন "প্লাগ" ইভেন্ট পেয়ে যায় এবং এই ডিভাইসটির বাসমন এবং ডিভনাম ইতিমধ্যে আমাদের ফাইলে সংরক্ষণ করা হয়, তবে বিজ্ঞপ্তি উত্পন্ন হয় না। এবং দ্বিতীয়ত, এই বিকল্পগুলি $attr{busnum}এবং $attr{devnum}ইভেন্টগুলির "সিরিজ" থেকে সাধারণত কোনও একটি ডিভাইসের জন্য উপলব্ধ। তবে যাইহোক, ব্যাখ্যা করা অ্যালগরিদমটি যে কোনও ক্ষেত্রেই তা বাছাই করা উচিত।


বর্তমান প্রকল্প পৃষ্ঠা: আমার- udev-notify

দেখে মনে হচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

ইনস্টলেশন বিশদ।

লিনাক্স মিন্ট ১৩-এ পরীক্ষিত, আমি বিশ্বাস করি যে এটি উবুন্টু এবং অন্যান্য উবুন্টুর ডেরিভেটিভগুলিতে কাজ করা উচিত এবং আমি আশা করি এটি যে কোনও * নিক্স সিস্টেমে কাজ করবে udev

  • প্রকল্পের পৃষ্ঠায় যান , সেখান থেকে উত্স পান এবং তাদের কোথাও রাখুন। এটিতে একটি মাত্র প্রধান স্ক্রিপ্ট my-udev-notify.shরয়েছে : তবে সংরক্ষণাগারটিতে প্লাগ / আনপ্লাগ নোটিফিকেশনগুলির শব্দগুলিও রয়েছে, আরও কিছু তথ্য রয়েছে, readme.txtবিশদ দেখুন।
  • /etc/udev/rules.d/my-udev-notify.rulesনিম্নলিখিত বিষয়বস্তুগুলি দিয়ে ফাইল তৈরি করুন : (যেখানে আপনি আনপ্যাক করেছেন সেখানে আপনার আসল পথে যাত্রা করতে ভুলবেন না my-udev-notify.sh!)

 ACTION=="add",    RUN+="/bin/bash /path/to/my-udev-notify.sh -a add    -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
 ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"

এর পরে, এটি নতুন সংযুক্ত ডিভাইসগুলির জন্য কাজ করা উচিত। এটি হ'ল আপনি যদি কিছু ডিভাইস প্লাগ করেন তবে আপনি বিজ্ঞপ্তি পাবেন না। আপনি যখন এটি আবার প্লাগ করবেন তখন আপনি পাবেন। (হ্যাঁ, আমার জন্য এটি কোনও ওদেব পুনরায় চালু না করেই কাজ করে it এটি যদি আপনার পক্ষে না হয় তবে পুনরায় বুট করার চেষ্টা করুন)

এটিকে সমস্ত ডিভাইসের জন্য কাজ করতে, কেবল আপনার সিস্টেমটিকে পুনরায় বুট করুন। দ্রষ্টব্য যে প্রথম বুটের সময় অনেকগুলি বিজ্ঞপ্তি থাকতে পারে (এর মধ্যে পরিচিত সমস্যাগুলি দেখুন readme.txt)। দ্বিতীয় বুটে, কোনও বিজ্ঞপ্তি থাকবে না (সিস্টেম বন্ধ থাকা অবস্থায় আপনি নতুন ডিভাইস প্লাগ না করে)

আপনি এটিকে কাস্টমাইজ করতে পারেন (ভিজ্যুয়াল এবং শব্দ বিজ্ঞপ্তিগুলি চালু / বন্ধ করুন, বা শব্দ পরিবর্তন করুন), বিশদ বিবরণের জন্য সংরক্ষণাগারে readme.txt পরীক্ষা করুন।


হতে পারে আপনার এই প্রশ্ন / উত্তরটি একবার দেখে নেওয়া উচিত: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৪৯৯২২৩/২ এটি pyudevবিজ্ঞাপিত হওয়ার জন্য ব্যবহার করে এবং এতে অতিরিক্ত স্ক্রিপ্টগুলির প্রয়োজন হয় না /etc/udev
ডেনিলসন সা মিয়া

ডিভাইস প্লাগ / আনপ্লাগ নোটিফিকেশনগুলি কি ডিফল্টরূপে লুকানো / অনুপলব্ধ?
gonzobrains

1
@ অ্যাজোনজোব্রেইনস, না, আপনি /etc/udeve/rules.d- এ সঠিক বিধি যুক্ত করার সাথে সাথেই এটি নতুন সংযুক্ত ডিভাইসের জন্য কাজ করা উচিত।
দিমিত্রি ফ্র্যাঙ্ক

@ দিমিত্রিফ্রঙ্ক বলতে কী বোঝাতে চেয়েছি তা হ'ল এই বিজ্ঞপ্তিগুলি স্বয়ংক্রিয়ভাবে ডিফল্টরূপে প্রদর্শিত হয় বা এগুলি প্রদর্শনের জন্য আপনাকে কি উপরের পদক্ষেপগুলি সম্পাদন করতে হবে? আমার প্রকল্পের জন্য, আমি তাদের দমন করতে চাই (যেমন, ডিফল্টরূপে কোনও বিজ্ঞপ্তি নেই)।
গঞ্জোব্রাইনগুলি

1
@ অ্যাঞ্জোনোব্রেইনস, আপনি যদি উপরের পদক্ষেপগুলি সম্পাদন না করে থাকেন এবং আপনি কোনও ডিভাইস প্লাগ / আনপ্লাগ করার সময় আপনার বিজ্ঞপ্তিগুলি দেখায়, তবে আমার স্ক্রিপ্টটির সাথে কিছু করার নেই। অন্য কিছু প্রোগ্রাম আপনার জন্য এটি করে।
দিমিত্রি ফ্র্যাঙ্ক

0

আপনার ভিজ্যুয়াল নোটিফিকেশন লাইনের আগে নিম্নলিখিত লাইনগুলি যুক্ত করুন, স্ক্রিপ্টটিকে কোন এক্স প্রদর্শন করতে হবে যাতে এটি notify-send(বা অন্য কোনও এক্স অ্যাপ্লিকেশন) চালানো উচিত সে সম্পর্কে ধারণা দিতে :

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

অবশ্যই, আপনাকে অবশ্যই আপনার ডেস্কটপ পরিবেশ (বা ডিসপ্লে ম্যানেজার) অনুযায়ী দ্বিতীয় লাইনটি পরিবর্তন করতে হবে। এই লাইনটি উবুন্টু 16.04 এর জন্য দুর্দান্ত কাজ করে যা ডেস্কটপ হিসাবে একতা এবং ডিসপ্লে ম্যানেজার হিসাবে লাইটডিএম ব্যবহার করে ।

( এই পোস্ট থেকে )


0
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 

যেখানে X_user আপনি যে ব্যবহারকারী হিসাবে চালনা করতে চান এবং X_userid ব্যবহারকারীর গ্রুপ আইডি

উদাহরণস্বরূপ বিগবার্ড এবং 1000

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.