ক্রোটাব থেকে বিজ্ঞপ্তি-প্রেরণ কাজ করে না


44

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

এখানে আমার স্ক্রিপ্ট

#!/bin/bash   
#One Piece Manga reminder    
#I created a file named .newop that contains the latest chapter.    
let new=$(cat ~/.newop)    
wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html

if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 ))    
then    
    (( new+=1 ))    
    echo $new    
    echo $new > ~/.newop    
    notify-send "A new chapter of One Piece was released."    
else    
    notify-send "No new chapter for One Piece."    
    notify-send "The latest chapter is still $new."    
fi        
exit

এবং আমি আমার ক্রোনটবে যা লিখেছি তা এখানে

0,15,30,45 12-23 * * 3   /home/jchester/bin/opreminder.sh

কেবল একটি অনুস্মারক, ক্রন্টবায় সমস্ত কমান্ডের রুট হিসাবে চালিত হওয়ার সাথে তাদের সামনে তাদের পাথ থাকা দরকার। ক্রোনটবে স্ক্রিপ্ট এবং লাইন সংযুক্তি সাহায্য করবে অন্যথায় আমরা কেবল আপনার সমস্যার জন্য অনুমান করছি
মীর বোর্গ

হ্যাঁ, দুঃখিত। আমি করেছি.
ব্যবহারকারী 158335

এটি একটি খারাপ ধারণা। বিজ্ঞপ্তিগুলি একটি "জিইউআই" জিনিস, ক্রোন একটি "কনসোল" জিনিস। কোনও গ্যারেন্টি নেই যে lib-notify বার্তাটি প্রদর্শনের জন্য কোনও উপায় খুঁজতে সক্ষম হবে। পরিবর্তে আপনার stdout এ ডেটা প্রেরণ বিবেচনা করা উচিত এবং ক্রোন এর বার্তাটি তথ্য প্রেরণে যত্ন নেওয়া উচিত। সাধারণত একটি ইমেল প্রেরণ করা হয়।
কোটায়ার

2
কিছু কিছু ক্ষেত্রে DISPLAY কে পরিবর্তনশীল স্থাপনের পাশাপাশি যেমন সাহায্য করতে পারে, ইন: export DISPLAY=:0
গ্লুটোনিমেট

1
কারণ 16.04, এটি আমার জন্য কাজ করেছে */1 * * * * eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";/usr/bin/notify-send -i appointment -c "im" "Keep Working"
KrIsHnA

উত্তর:


18

কমান্ডগুলির তাদের অবস্থান উল্লেখ করা দরকার। তাই হওয়া notify-sendদরকার/usr/bin/notify-send

সমস্ত আদেশের তাদের পূর্ণ পথ থাকা দরকার।

whereis notify-sendআপনার আদেশগুলি "লাইভ" কোথায় আছে তা দেখতে কমান্ডটি ব্যবহার করুন


2
এর মধ্যে বিড়াল, উইজেট, যদি, গ্রেপ, প্রতিধ্বনি ইত্যাদি অন্তর্ভুক্ত থাকে?
ব্যবহারকারী 158335

7
আমার সিস্টেমে অন্তত, notify-sendহয় PATHএকটি ক্রন কাজের জন্য এমনকি। দেখুন আমার উত্তর নিচে।
krlMLr

2
এটি উবুন্টু 17.04 এর সমাধান নয়। দেখুন askubuntu.com/a/472769/413683 এবং askubuntu.com/a/834479/413683 পরিবর্তে।
ম্যাটিউজ পিয়োত্রস্কি

2
এটি সমস্যা নয়। সমস্যাটি হ'ল ক্রোন স্ক্রিপ্টগুলি ব্যবহারকারী সেশনের অধীনে চলে না এবং ব্যবহারকারীর লগইন সেশনের পরিবেশ সম্পর্কে কোনও ধারণা নেই। বিজ্ঞপ্তিটি প্রেরণের জন্য বিজ্ঞপ্তি-প্রেরণের জন্য একটি ডিবিএস সেশন বাসের সাথে সংযোগ স্থাপন করা দরকার, বাইনারিটি কোন পথ থেকে ডাকা হবে তা কোনও ব্যাপার নয়, যখন এটি সঠিক সেশন বাসের সাথে সংযোগ না করে।
dobey

2
এটি উত্তর নয়। অবশ্যই, যদি এক্সিকিউটেবলটি সনাক্ত না করা যায় তবে এটি চলবে না, তবে বিট: ১. পাঠ্যপথের উপর বিজ্ঞপ্তি-প্রেরণ রয়েছে সুতরাং এটি অবস্থিত হবে even যদিও এটি রাস্তায় না থাকলেও এবং আপনি পুরো পথটি নির্দিষ্ট করেছেন এটি এখনও থাকবে কাজ করছে না, কারণ আসলে DBUS_SESSION_BUS_ADDRESS বিজ্ঞপ্তি-প্রেরণের জন্য সেট করতে হবে। এবং সঠিক উত্তরটি কমির থেকে।
ক্রিস জেস

31

কমপক্ষে জিনোম শেল-এ 13.04-এ জিনিসগুলি আলাদা বলে মনে হচ্ছে।

প্রথমত, envব্যবহারকারীর zzyxy(মূলের নয়) ক্রোন জব থেকে চালানো হলে এটি প্রিন্ট হয় :

HOME=/home/zzyxy
LOGNAME=zzyxy
PATH=/usr/bin:/bin
XDG_RUNTIME_DIR=/run/user/zzyxy
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/zzyxy

উবুন্টুফরমস.আর.এস-এ দাহিতিএফ-এর মন্তব্য অনুসারেnotify-send কাজ পেতে , DBUS_SESSION_BUS_ADDRESSপরিবেশের পরিবর্তনশীল সেট করা প্রয়োজন বলে মনে হচ্ছে । আপনার প্রকৃত কাজের বিবরণীতে কেবল নিম্নলিখিতটি সংশোধন করুন:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

এটি সেট করা প্রয়োজন বলে মনে হচ্ছে না DISPLAY


4
ধন্যবাদ, শেষ পর্যন্ত আমার পক্ষে এটি কাজ করেছিল। জুবুন্টুতে আপনাকে পরিবর্তন gnome-sessionকরতে হবে xfce4-session
shx

এটি 14.04 এর জন্য কাজ করার একমাত্র উত্তর, স্বীকৃত ব্যক্তির সুস্পষ্ট ইঙ্গিত সহ।
ওয়াটওয়ার

1
এর পরিবর্তে আমার কোনও gnome-sessionব্যবহার ছিল না এবং ব্যবহার gnome-shellকরা হয়নি (সাবধান থাকুন gnome-shell-calendar-serverযাতে pgrep2 পিডসও পাবেন)। আমার আরও প্রয়োজন DISPLAY=:0কারণ আমি 2 টি ফিজিকাল স্ক্রিন ব্যবহার করছি এবং এটি সংজ্ঞায়িত হয়নি। ধন্যবাদ!
soyuka

যদি আপনি ওপেনবক্স (সিবি ++ এর মতো) openboxব্যবহার করেন তবে এর জন্য অদলবদল করুন gnome-session
ACK_stoverflow

এটি সঠিক উত্তর, এবং গৃহীত উত্তরটিও সঠিক নয়, এটি ডিআইএসএল ভেরিয়েবল সম্পর্কে কথা বলে যা এমনকি প্রয়োজন হয় না, বা এটি আসলে সমস্যাটিও সমাধান করে।
ক্রিস জেস

24

notify-sendক্রোন দ্বারা শুরু করা হলে কমান্ড আপনার পর্দায় বার্তাটি প্রদর্শন করবে না। আপনার স্ক্রিপ্টের শীর্ষে কেবল লক্ষ্য প্রদর্শন যুক্ত করুন, উদাহরণস্বরূপ:

export DISPLAY=:0

14.10-এও আমাকে এটি করতে হয়েছিল। অন্যথায় আমি এই ত্রুটিটি পেয়ে যাবgdk_mir_display_open Failed to connect to Mir: Failed to connect to server socket: No such file or directory Option parsing failed: Cannot open display:
জোয়েলমব

1
এই. এবং echo $DISPLAYআপনার প্রদর্শনটি সত্যই তা নিশ্চিত করার জন্য একটি টার্মিনালে ব্যবহার করুন :0(এটি সাধারণত হয় তবে সর্বদা হয় না)।
চিহ্নিত করুন

কেবল
এটিই

5

কমপক্ষে উবুন্টু 14.04 এর জন্য, উপরে Klrmr এর প্রতিক্রিয়া সঠিক উত্তর। এটি $ PATH- তে সাধারণত পাঠানো বা বিজ্ঞপ্তি-প্রেরণ বা অন্য যে কোনও কিছুর জন্য পুরো পথ নির্ধারণের প্রয়োজন বলে মনে হয় না।

নীচে একটি ক্রোন স্ক্রিপ্ট রয়েছে যখন আমি কোনও ল্যাপটপের ব্যাটারি অবস্থা খুব কম হয়ে যায় তখন ভার্চুয়াল মেশিনটি বন্ধ করতে ব্যবহার করি। উপরের klrmr এর প্রতিক্রিয়াতে DBUS_SESSION_BUS_ADDRESS লাইন সেটিংসটি হ'ল এমন পরিবর্তন যা অবশেষে সতর্কতাটি সঠিকভাবে কাজ করেছে।

#!/bin/bash

# if virtual machine is running, monitor power consumption
if pgrep -x vmware-vmx; then
  bat_path="/sys/class/power_supply/BAT0/"
  if [ -e "$bat_path" ]; then
    bat_status=$(cat $bat_path/status)
    if [ "$bat_status" == "Discharging" ]; then
      bat_current=$(cat $bat_path/capacity)
      # halt vm if critical; notify if low
      if [ "$bat_current" -lt 10 ]; then
        /path/to/vm/shutdown/script
        echo "$( date +%Y.%m.%d_%T )" >> "/home/user/Desktop/VM Halt Low Battery"
        elif [ "$bat_current" -lt 15 ]; then
            eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
            notify-send -i "/usr/share/icons/ubuntu-mono-light/status/24/battery-caution.svg"  "Virtual machine will halt when battery falls below 10% charge."
      fi
    fi
  fi
fi

exit 0

এটি আমার জন্য পুরোপুরি পুরোপুরি কাজ করার সমাধানটি ছিল, আমি আমার স্ক্রিপ্টে "ইভাল ..." লাইনটি যুক্ত করেছি যেটি আমি ক্রন্টব থেকে চালাচ্ছি - এখন এটি পুরোপুরি কাজ করে
এমটিএল দেব

2

আমার ক্ষেত্রে উবুন্টু 16.04 এর সাথে কোনও স্পষ্ট পাথের প্রয়োজন ছিল, আমি কেবল যুক্ত করেই সমস্যাটি সমাধান করি

DISPLAY কে =: 0

কল নোটিফাইড-প্রেরণের আগে ক্রন্টাবের প্রথম সারিতে


এটি 16.04 এ কাজ করার জন্য প্রয়োজনীয় জিনিস।
জোনাথন ল্যান্ড্রাম

1

প্রথম অপরাধী হ'ল আপনার ক্রন্টব ফাইল, আপনাকে সেই ব্যবহারকারীর নামও উল্লেখ করতে হবে যার সাহায্যে স্ক্রিপ্টটি কার্যকর করা উচিত, আরও ভাল করে এটি মূল হিসাবে রাখা উচিত

0,15,30,45 12-23 * * 3 root   /home/jchester/bin/opreminder.sh

এবং তারপরে আপনার স্ক্রিপ্টের মধ্যে জিইউআই ব্যবহারকারীর ব্যবহারকারীর নাম ব্যবহার করা উচিত এবং জিইউআইয়ের মালিকানাধীন ব্যবহারকারী হিসাবে কমান্ডটি কার্যকর করতে "sudo or su" দিয়ে বিজ্ঞপ্তি-প্রেরণের জন্য এটি প্রস্তুত করা উচিত

উদাহরণ:

su gnome_user_name -c 'notify-send "summary" "body"'

অথবা

sudo -u gnome_user_name notify-send "summary" "body"

যেখানে gnome_user_nameব্যবহারকারী গুই অধিবেশন আপনার পারেন লগ ইন শুরু ব্যবহারকারীর নাম, এবং আপনি এটা একটি গতিশীল পিক করতে চান তাহলে, আপনি এটি থেকে পেতে পারেন

GNOME_USER=`ps -eo uname,cmd | grep gnome-session| head -1 | cut -d' ' -f1 `

উদাহরণ:

su $GNOME_USER -c 'notify-send "summary" "body"'

অথবা

sudo -u $GNOME_USER notify-send "summary" "body"

1
আমি মনে করি যে যখন আপনার ব্যবহারকারী নামটি X অক্ষরের চেয়ে দীর্ঘ হয়, আপনার ব্যবহারকারী নামটি কেটে ফেলা হয়: উদাহরণস্বরূপ, আমার ব্যবহারকারীর নামটি রয়েছে oniltonmaciel, তবে প্রদর্শিত $GNOME_USERহবে onilton+(কার্যকর হবে না)
অনিলটন ম্যাকিয়েল

এটি আরও ভাল কমান্ড দিয়ে ঠিক করুন
এস 471

1

বাইনারি dbus ঠিকানা পুনরুদ্ধার করার উপায়টি ইদানীং পরিবর্তিত হয়েছে বলে মনে হয়। উবুন্টু 15.04 এ (বিবিধ ভার্ভেট) "বিজ্ঞপ্তি-পাঠান 0.7.6" সহ, নিম্নলিখিত দুটি ভেরিয়েবলের প্রয়োজন:

export HOME=/home/$notify_user
export DISPLAY=:0.0

'Krlmlr' দ্বারা বিবৃতি সূক্ষ্ম মূল্যায়ন করে এবং সঠিক ঠিকানাটি সেট করে, তবে ডায়ালগটি ক্রোন জব থেকে পপ আপ হবে না।


0

ক্রোনটবে যদি আপনার স্ক্রিপ্টটি রুট হিসাবে চলমান থাকে তবে উপরের উত্তরগুলি সম্ভবত কাজ করবে না। এই ফাংশনটি চেষ্টা করুন, যা 16.04-এ আমার পক্ষে ভাল কাজ করে:

notify_all() {
    local title=$1
    local msg=$2

    who | awk '{print $1, $NF}' | tr -d "()" |
    while read u d; do
        id=$(id -u $u)
        . /run/user/$id/dbus-session
        export DBUS_SESSION_BUS_ADDRESS
        export DISPLAY=$d
        su $u -c "/usr/bin/notify-send '$title' '$msg'"
    done 
}

(উত্স: https://unix.stackexchange.com/a/344377/7286 )


0

dbus-sessionপ্রক্রিয়া নির্ভর করা ভাল , এটি DBUS_SESSION_BUS_ADDRESSউপস্থিত সমস্ত সিস্টেমে চলমান করা উচিত ।

একটি স্ক্রিপ্ট তৈরি করুন:

#!/bin/bash
# notify.sh

environs=`pidof dbus-daemon | tr ' ' '\n' | awk '{printf "/proc/%s/environ ", $1}'`
export DBUS_SESSION_BUS_ADDRESS=`cat $environs 2>/dev/null | tr '\0' '\n' | grep DBUS_SESSION_BUS_ADDRESS | cut -d '=' -f2-`
export DISPLAY=:0

notify-send "It works!"

এটি সম্পাদনযোগ্য করুন:

$ chmod +x ~/notify.sh

এটি ক্রোনটবে যুক্ত করুন:

* * * * * $HOME/notify.sh

0

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

# Crontab is
* 21 * * * /bin/sh /home/tristik/cron.sh
#!/bin/sh 
# cron.sh
# Notifies the user of date and time
source /home/tristik/.bashrc
pid=$(pgrep -u tristik gnome-session | head -n 1)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
export DBUS_SESSION_BUS_ADDRESS=$dbus
export HOME=/home/tristik
export DISPLAY=:1
/usr/bin/notify-send 'title' "$(/bin/date)"

0

আমি এখনই নীচের রেসিপিটি ব্যবহার করে উবুন্টু 15.10 তে দারুচিনি ডেস্কটপের সাথে কাজ করতে পেরেছি:

if [ ! -v DBUS_SESSION_BUS_ADDRESS ]; then
  pid=$(pgrep -u $LOGNAME cinnamon-sessio)
  eval "export $(\grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ)"
fi
notify-send "$RESUME" "$INFO"

কৌশলটি বুঝতে পেরেছিল যে 'দারুচিনি-অধিবেশন' পিগ্রিপ এটির জন্য খুব দীর্ঘ:

$ pgrep -u $LOGNAME cinnamon-session
$ pgrep -u $LOGNAME cinnamon
30789
30917
30965
30981
31039
31335
$ ps -a | \grep cinnamon
30789 tty2     00:00:00 cinnamon-sessio
30917 tty2     00:00:02 cinnamon-settin
30965 tty2     00:00:00 cinnamon-launch
30981 tty2     00:04:15 cinnamon
31039 tty2     00:00:00 cinnamon-killer
31335 tty2     00:00:00 cinnamon-screen
$ ps a | \grep cinnamon
 4263 pts/1    S+     0:00 grep cinnamon
30779 tty2     Ssl+   0:00 /usr/lib/gdm/gdm-x-session --run-script cinnamon-session-cinnamon
30789 tty2     Sl+    0:00 cinnamon-session --session cinnamon
30917 tty2     Sl+    0:02 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/cinnamon-settings-daemon
30965 tty2     Sl+    0:00 /usr/bin/python2 /usr/bin/cinnamon-launcher
30970 tty2     Sl+    0:00 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/csd-printer
30981 tty2     Sl+    4:16 cinnamon --replace
31039 tty2     Sl+    0:00 /usr/bin/python2 /usr/bin/cinnamon-killer-daemon
31335 tty2     Sl+    0:00 cinnamon-screensaver
$ pgrep -u $LOGNAME cinnamon-sessio
30789

আমার p গ্রেপ ব্যবহার করতে হয়েছিল কারণ আমার গ্রেপটি এলিয়াস হয়েছে

$ alias grep
alias grep='grep -n --color=always'

0

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

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


0

লোকেলের python3সাথে ক্রন্টবায় কল করার কারণে সমস্যা UTF-8

টিএল; ডিআর: ক্রন্টাব ডাব্লু / লোকালে উপসর্গ কল:

*/5 * * * * LC_ALL=en_US.utf-8 LANG=en_US.utf-8 ~/.local/bin/watson-notify

এছাড়াও ক্লিক করুন এবং পাইথন 3 :

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/watson/__main__.py", line 6, in <module>
    cli.cli()
  File "/usr/lib/python3/dist-packages/click/core.py", line 759, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 693, in main
    _verify_python3_env()
  File "/usr/lib/python3/dist-packages/click/_unicodefun.py", line 123, in _verify_python3_env
    'for mitigation steps.' + extra)
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment.  Consult http://click.pocoo.org/python3/ for mitigation steps.

This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8

0

Libnotify ব্যবহার করা সমস্ত ক্রন্টব স্ক্রিপ্টের জন্য, আমি এটি ব্যবহার করি:

notify_user() {
    local user=$(whoami)
    notify-send -u normal -t 4000 "System Backup" "Starting backup"
}

notify_user # and do other stuff

আমি রুট মোডে ক্রোন ব্যবহার করা হলেও এটি কাজ করে।


0

আপনার কেবলমাত্র X_user এবং X_userid দরকার ser কমান্ড বেলো উভয় প্রতিস্থাপন করুন।

সিস্টেমযুক্ত সঙ্গে সমাধান

/etc/systemd/system/opreminder.service # সার্ভিস ফাইল

[Unit]
Descrption=some service to run

[Service]
User=[X_user]
ExecStart=/home/jchester/bin/opreminder.sh


/etc/systemd/system/opreminder.timer #timer file

[Unit]
Description=Some desc


[Timer]
OnCalendar=0,15,30,45 12-23 * * 3 

[Install]
WantedBy=list.timer.target

/home/jchester/bin/opreminder.sh # স্ক্রিপ্ট

#!/usr/bin/env bash

sudo -u [X_user] DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/[X_userid]/bus notify-send 'Hello world!' 'This is an example notification.'

উদ্দেশ্য ফাইলের সাথে সার্ভিস ফাইলটি ইতিমধ্যে সেট করা থাকলে sudo -u ব্যবহার করার দরকার নেই

সূত্র: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_pogramming

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