ক্রোন সহ বিজ্ঞপ্তি-প্রেরণ ব্যবহার করে


32

আমি কেআরডি / অসাধারণ ডাব্লুএম দিয়ে আর্চ লিনাক্স ব্যবহার করছি। আমি notify-sendকাজ করার চেষ্টা করছি cron

আমি বিন্যাস DISPLAY/ XAUTHORITYভেরিয়েবলগুলি সেট করার চেষ্টা করেছি এবং notify-send"সুডো-ইউ" দিয়ে চালিয়ে যাচ্ছি , ফলাফলটি ছাড়াই।

আমি অধিবেশন থেকে ইন্টারেক্টিভভাবে বিজ্ঞপ্তি পাঠাতে এবং বিজ্ঞপ্তিগুলি পেতে সক্ষম হয়েছি।

এফডাব্লুআইডাব্লু, ক্রোন জব ঠিকঠাক চলছে যা আমি একটি অস্থায়ী ফাইলে স্টাফ প্রতিধ্বনি করে যাচাই করেছি। এটি কেবলমাত্র "বিজ্ঞপ্তি-প্রেরণ" যা কাজে ব্যর্থ হয়।

কোড:

[matrix@morpheus ~]$ crontab -l
* * * * *  /home/matrix/scripts/notify.sh

[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest

[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send

[matrix@morpheus ~]$ 

যেমন আপনি ইকো দেখতে পাচ্ছেন আগে ও পরে নোটিফাইড-প্রেরণ কাজ করেছেন।
এছাড়াও আমি সেট করার চেষ্টা করেছিDISPLAY=:0.0

আপডেট: আমি আরও কিছুটা অনুসন্ধান করে দেখতে পেলাম যে DBUS_SESSION_BUS_ADDRESS সেট করা দরকার। এবং আমার ইন্টারেক্টিভ সেশন থেকে প্রাপ্ত মানটি ব্যবহার করে এটি হার্ডকোডিংয়ের পরে, ছোট্ট "হ্যালো" বার্তাটি প্রতি মিনিটে পর্দায় উঠতে শুরু করে!

তবে ক্যাচটি হ'ল এই পরিবর্তনশীল সেই পোস্টের জন্য স্থায়ী নয়, সুতরাং আমি সেখানে প্রস্তাবিত নামযুক্ত পাইপ সমাধানটি চেষ্টা করব।

[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest

যেহেতু cronবিজ্ঞপ্তি-প্রেরণকে সমর্থন করে না বলে মনে হচ্ছে (কমপক্ষে সরাসরি নয়) এমন কি আরও কিছু বিজ্ঞপ্তি সিস্টেম রয়েছে cronযা আমি ব্যবহার করতে পারি তার চেয়ে বেশি বন্ধুত্বপূর্ণ?


এটি যতদূর আমি দেখতে পাচ্ছি কাজ করা উচিত। আপনি কেন &>>/tmp/crontestবিজ্ঞপ্তি প্রেরণ লাইনে একটি যুক্ত করবেন না এবং দেখুন notify-sendকোনও ত্রুটি বার্তা দেয় কিনা ।
গ্রামীণ

কৌতূহলের বাইরে, আপনি কি আমার সমাধান চেষ্টা করেছিলেন? এটি অনেক সহজ বলে মনে হচ্ছে এবং আমার ডেবিয়ানের উপর নিখুঁতভাবে কাজ করেছে। আমি ঠিক জানতে চাইছি এটি ডেবিয়ান নির্দিষ্ট কিনা না
টেরডন

@terdon আমি আপনার সমাধানটি চেষ্টা করেছি (কেবলমাত্র একটি দ্রুত পরীক্ষা) এবং এটি আমার ডেবিয়ান সিস্টেমে কাজ করে বলে মনে হচ্ছে। আমি এটি জানতে চাই যে এটি সাধারণত প্রযোজ্য কারণ এটি সত্যিই সহজ।
মার্কো

@ মার্কো আমি এলএমডিইতে আছি (মূলত দেবিয়ান টেস্টিং) এবং দারুচিনিটি ডিইই হিসাবে ব্যবহার করছি। এটির বাইরেও যদি এটি কাজ করে তবে আপনাকে বলতে পারব না।
টেরডন

: @Marco & terdon: উবুন্টু বলছি তাই করতে হয় ubuntuforums.org/showthread.php?t=1727148
justsomeone

উত্তর:


29

আপনাকে DBUS_SESSION_BUS_ADDRESSভেরিয়েবল সেট করতে হবে । ডিফল্ট ক্রোন ভেরিয়েবল অ্যাক্সেস নেই। এটির প্রতিকারের জন্য নিম্নলিখিত স্ক্রিপ্টটি কোথাও রাখুন এবং যখন ব্যবহারকারী লগ ইন করেন তখন কল করুন, উদাহরণস্বরূপ দুর্দান্ত এবং run_onceউইকিতে উল্লিখিত ফাংশনটি ব্যবহার করুন। যে কোনও পদ্ধতি কাজ করবে, যেহেতু প্রয়োজনের তুলনায় ফাংশনটি প্রায়শই বলা হয় তবে এটি ক্ষতি করে না।

#!/bin/sh

touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus

exit 0

এটি প্রয়োজনীয় একটি Dbus evoniment ভেরিয়েবলযুক্ত একটি ফাইল তৈরি করে। তারপরে ক্রোন দ্বারা লিখিত স্ক্রিপ্টে আপনি স্ক্রিপ্টটি সোর্স করে ভেরিয়েবলটি আমদানি করুন:

if [ -r "$HOME/.dbus/Xdbus" ]; then
  . "$HOME/.dbus/Xdbus"
fi

এখানে একটি উত্তর যা একই পদ্ধতি ব্যবহার করে।


1
আমি প্রায় সমাধানের কাছাকাছি ছিল দেখে খুশি। ধন্যবাদ মার্কো, এটা পরিষ্কার!
ন্যায়সঙ্গত

দুর্দান্ত, আমি আপনার উত্তরটি পুনরায় ব্যবহার করেছি এবং এখানে আরও কিছু বিশদ নির্দেশাবলী যুক্ত করেছি: Askubuntu.com/a/537721/34298
rubo77

এটি কি সুরক্ষা ঝুঁকি হবে না? সিকিউরিটি.স্ট্যাকেক্সেঞ্জাওয়েজ.কমিশন
71019/…

@ গিলস আপনারা আড্ডায় উল্লিখিত
rubo77

আমি উবুন্টু 15.10 এ DBUS সহ অন্যান্য অনেক উত্তর চেষ্টা করেছি এবং কিছুই কার্যকর হয়নি। এটি সহজ এবং নির্বিঘ্নে কাজ করে।
বেসটিয়ান

16

ক্রোনটবে নিজেই আপনাকে ভেরিয়েবলগুলি সেট করতে হবে:

DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority

# m h  dom mon dow   command 
* * * * *  /usr/bin/notify-send "hello"

sudoদরকার নেই , কমপক্ষে আমার সিস্টেমে নেই।


আপনার সময় জন্য ধন্যবাদ টেরডন। এটি একটি সহজ সমাধান বলে মনে হচ্ছে। দুর্ভাগ্যক্রমে, এটি আমার পক্ষে কার্যকর হয়নি
ন্যায়সঙ্গত

@ জাস্টসোমোন হুঁ, ঠিক আছে, তখন ডেস্কটপ পরিবেশের উপর নির্ভর করে।
টেরডন

আমি মনে করি এটি ডিস্ট্রো বা ডেস্কটপ পরিবেশের সাথে কিছু করার জন্য পেয়েছে। উবুন্টু ব্যবহারকারীদের জন্য, সরাসরি অনলাইন সমাধানগুলি আমি অনলাইন ফোরামে যা দেখেছি তা থেকে ভাল কাজ করে বলে মনে হচ্ছে।
ন্যায়সঙ্গত

@ জাস্টসোমোন আমি ডিবিয়ান (এলএমডিই) তে ডিএন হিসাবে দারুচিনি ব্যবহার করছি। এক্স কীভাবে শুরু হয় বা ডিই দ্বারা ব্যবহৃত বিজ্ঞপ্তি সিস্টেমের সাথে কিছু করতে পারে to
টেরডন

নিশ্চিত হয়ে এটি উবুন্টু 14.04 / 14.10 এ কাজ করে। জিনোম এবং ityক্যের সাথে।
জর্ডন বেডওয়েল

8

এক্স সেশন সম্পর্কিত পরিবেশগত ভেরিয়েবলগুলি পাওয়ার সবচেয়ে নিরাপদ উপায় হ'ল এক্স-এ লগ ইন করা ব্যবহারকারীর প্রক্রিয়াটির পরিবেশ থেকে সেগুলি পাওয়া Here এখানে ঠিক একই উদ্দেশ্যে ব্যবহৃত স্ক্রিপ্টটির একটি রূপান্তর এখানে দেওয়া হয়েছে (যদিও DBUS_SESSION_BUS_ADDRESS না করে ' টিয়াকে আমার পক্ষে সমস্যা মনে হয় না):

X=Xorg                   # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"

tty=$(ps h -o tty -C $X | head -1)
[ -z "$tty" ] && exit 1

# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | grep "^[^ ]\+[ ]\+$tty")

x_user=$(echo $who_line | cut -d ' ' -f 1)  # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7)     # the user's logon process

for env_name in $copy_envs
do
  # if the variable is not set in the process environment, ensure it does not remain exported here
  unset "$env_name"

  # use the same line as is in the environ file to export the variable
  export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done

sudo -u "$x_user" notify-send "hello"

এটি এটি খুঁজে পাওয়া প্রথম এক্স ব্যবহারকারীকে বার্তা প্রেরণ করে, যদিও আপনি এটি সমস্ত ব্যবহারকারীর কাছে প্রেরণের জন্য একটি লুপ যুক্ত করতে পারেন।

হালনাগাদ

দেখে মনে হচ্ছে যে utmp ফর্ম্যাটটিতে আপডেটগুলি whoতার দ্বিতীয় কলামে টিটির পরিবর্তে ডিসপ্লে মুদ্রণ করবে। এটি আসলে জিনিসগুলিকে আরও সহজ করে তোলে, এর আগে এটি কেবলমাত্র মন্তব্যে প্রদর্শনটি শেষে প্রিন্ট করেছিল এবং আমি স্থির করেছি যে এটি মূল উত্তরের উপর নির্ভর করা নিরাপদ নয়। যদি এটি হয় তবে এটি ব্যবহার করে দেখুন:

X=Xorg                   # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"

# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | awk '$2 ~ ":[0-9]"')

x_user=$(echo $who_line | cut -d ' ' -f 1)  # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7)     # the user's logon process

for env_name in $copy_envs
do
  # if the variable is not set in the process environment, ensure it does not remain exported here
  unset "$env_name"

  # use the same line as is in the environ file to export the variable
  export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done

sudo -u "$x_user" notify-send "hello"

এটি আমার পক্ষে ট্রাস্টিতে কাজ করে না কারণ who_lineকমান্ডটিতে টিটিটি প্রিন্ট করা হয়নি । আউটপুট মত দেখাচ্ছে me :0 2015-09-23 10:40 ? 17234
blujay

1
@ ব্লুজয়, আপডেট হয়েছে।
গ্রিম 8

ধন্যবাদ, কাজ করে। যাইহোক, আমি যেমন একটি পৃথক উত্তরে পোস্ট করেছি, এর আরও সহজ সমাধান রয়েছে।
blujay

@ ব্লুজয় হ্যাঁ, এটি একটি বহনযোগ্য উত্তরের চেষ্টা ছিল। যদিও এটি সত্যই সম্ভব তা নিশ্চিত নয়, তবে বেশিরভাগ ক্ষেত্রে এটি এখনও কাজ করা উচিত।
গ্রামীণ

2

এই ওয়ান-লাইনার ক্রোনির সাথে মাঞ্জারোতে আমার জন্য কাজ করেছিল:

# Note: "1000" would be your user id, the output of... "id -u <username>" 
10 * * * * pj DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hello world!' 'This is an example notification.'

খুব কুরুচিপূর্ণ DBUS_blah_blah ছাড়া এটি মোটেও কার্যকর হয় না। আমি journalctl -xb -u cronieসাহায্যকারীও পেয়েছি । আমি এখনও ক্রোনির সাথে পরিচিত নই, তবে আমার "ক্রোনট্যাব" তৈরি করেছি /etc/cron.d/mycronjobsএবং আমি নিশ্চিত নই যে এই ফাইলের নামটি প্রয়োজন কিনা, অথবা এটি ক্রোন.ডি ডিরেক্টরিতে কেবল সবকিছু পড়তে পারে কিনা।

আমি এখানে সমাধানটি পেয়েছি https://wiki.archlinux.org/index.php/Desktop_notifications


2

আমি উবুন্টু 18.04 এ i3 ব্যবহার করি। এটি সমাধান করার জন্য আমার উপায় হ'ল:

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"


1

উবুন্টু ট্রাস্টির ক্রোনজবটিতে আমার জন্য বিজ্ঞপ্তি-প্রেরণের কাজটি করার পক্ষে এটি যথেষ্ট:

#!/bin/bash
export DISPLAY=$(who -u | awk  '/\s:[0-9]\s/ {print $2}')

এটি কেবল DISPLAYক্রোনজব চলমান ব্যবহারকারীর জন্য রফতানি করে । এটি আমার জন্য বিন্যাস XAUTHORITYবা স্থাপন ছাড়াই কাজ করে DBUS_SESSION_BUS_ADDRESS


1
পাশাপাশি উবুন্টু 16.04 এ কাজ করে। আমার কাছে আসলে পার্ল স্ক্রিপ্ট চালু করছে, কোন সিস্টেম () সা বাশ স্ক্রিপ্ট, যা আলাদা পার্ল স্ক্রিপ্ট চালু করে, যা একটি সিস্টেম সম্পাদন করে ("বিজ্ঞপ্তি-প্রেরণ ...")। বাশ স্ক্রিপ্টে রফতানি কমান্ড যুক্ত করা সেই স্ক্রিপ্টটির জন্য পরিবেশটি পরিবর্তিত করেছে, যা সর্বশেষ পার্ল স্ক্রিপ্ট উত্তরাধিকার সূত্রে প্রাপ্ত হয়ে সিস্টেমে উপলব্ধ করা হয়েছে ("বিজ্ঞপ্তি-পাঠান ...")। ভাল খুজেছে ব্লুজে!
টিম

1

লিনাক্সে যারা পাইথন প্যাকেজ ইনস্টল করতে আরামদায়ক তাদের জন্য আমি একটি বিজ্ঞপ্তি-প্রেরণ-হেডলেস প্রোগ্রাম প্রকাশ করেছি যা আমার পক্ষে ভাল কাজ করছে। এটি /procপ্রয়োজনীয় ব্যবহারকারীর নাম এবং পরিবেশের ভেরিয়েবলগুলি অনুসন্ধান করে এবং তারপরে notify-sendএই ভেরিয়েবলগুলির সাথে সঞ্চালিত হয় (এটি sudoপ্রয়োজনে প্রয়োজনীয় ব্যবহারকারীর স্যুইচ করতে ব্যবহার করবে )।


1

আপনি একটি স্ক্রিপ্টও তৈরি করতে পারেন:

#!/usr/bin/env bash
runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"'

তারপরে এটি চালান sudo। যাইহোক, যেহেতু crontab -eএটি তৈরি করা ব্যবহারকারীর সাথে সমস্ত কমান্ড চালায়, নিম্নলিখিত ব্যতীত ডাকার সময় যথেষ্ট হবে sudo:

#!/usr/bin/env bash
DISPLAY=:0 notify-send "hey there user"

অন্তত এটা আমার জন্য না। এগুলি সমস্ত পরিবেশ কনফিগারেশনের উপর নির্ভরশীল বলে মনে হচ্ছে।


0

আমি এমপিডি পোস্ট করতে ক্রোন এই স্ক্রিপ্টটি ব্যবহার করি এখন প্রতি ঘণ্টায় টুইটারে খেলছি

#!/bin/bash
export DISPLAY=":0.0"
msg=$(mpc current -h 192.168.1.33)
twitter set "#MPD Server nowplaying $msg :  http://cirrus.turtil.net:9001"
#ttytter -status="#MPD Server nowplaying $msg. http://cirrus.turtil.net:9001"

exit 

অনুরূপ স্ক্রিপ্ট বিজ্ঞপ্তি-প্রেরণ ব্যবহার করে

#!/bin/bash
export DISPLAY=":0.0"
notify-send -i ~/.icons/48arch.png 'OS- Archlinux x86_64 : DWM Window Manager' 'Installed on Sun Apr 21 2013 at 18:17:22' 
exit

আপনি সমস্যার সম্মুখীন হতে পারেন কারণ কেডিএর নিজস্ব নোটিফাই-ডিমন আইআরসি ব্যবহার করে।


0

এর মূল্য কী ....

এটি কাজ করতে আমাকে দেবিয়ান জেসির উপরের সমস্তটি ব্যবহার করতে হয়েছিল ...

export DISPLAY=:0.0
export HOME=/home/$user
source "$HOME/.dbus/session-bus/*-0"

এর মধ্যে যে কোনও একটি ছেড়ে দেওয়ার ফলে এটি কাজ বন্ধ করে দেয়।


এই শেষ লাইনটি এখানে লিখিত হিসাবে কিছুই করবে না কারণ *-0আপনার session-busডিরেক্টরিতে আক্ষরিকভাবে কোনও ফাইল বলা হবে না । আপনি বোঝাতে পারে source "$HOME"/.dbus/session-bus/*-0
রোয়াইমা

0

Sudo ব্যবহার:

sudo -u $currentxuser notify-send $message

টিপ:

আমরা এই আদেশ দ্বারা বর্তমান এক্স ব্যবহারকারী পেতে পারি

ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '

এছাড়াও...

currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser

জানা ভাল :

মূলের অধীনে চলমান ক্রোনটির এক্স অ্যাক্সেস নেই, সুতরাং সমস্ত জিআই কমান্ড প্রদর্শিত হবে না, একটি সহজ সমাধান হ'ল এই কমান্ডের সাহায্যে বর্তমান এক্স ব্যবহারকারীর জন্য অনুমোদিত এক্স ব্যবহারকারীকে রুট যুক্ত করা

এক্স ব্যবহারকারী শেল থেকে

xhost local:root

অথবা

sudo -u $currentxuser xhost local:root

-1

গ্রামীম যা সরবরাহ করেছে তার চেয়ে কম জটিল স্ক্রিপ্ট এখানে। তাঁর স্ক্রিপ্ট আমার পক্ষে কাজ করে নি, $who_lineসর্বদা খালি ছিল। আমার স্ক্রিপ্ট কোনও প্রক্রিয়া সন্ধানের সাথে এত সময় নষ্ট করে না। পরিবর্তে, এটি কেবল সমস্ত চেষ্টা করে এবং পাওয়া সর্বশেষ দরকারী মানটি বেছে নেয়। আমি xubuntu 14.04 চালাচ্ছি এবং কিছু lxc পাত্রে চলছে যা সম্ভবত এই ধরণের স্ক্রিপ্টগুলিকে বিভ্রান্ত করে।

env="$(
  ps -C init -o uid,pid | while read u p; do
    [ "$u" = "`id -u`" ] || continue
    grep -az '^DBUS_SESSION_BUS_ADDRESS=' /proc/$p/environ | xargs -0
  done | tail -1
)"

export "$env"

notify-send "test"

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