नोटिफ़-सेंड क्रॉस्टैब से काम नहीं करता है


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

और यहाँ मैं अपने crontab में क्या लिखा है

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

बस एक अनुस्मारक, क्रैटाब में सभी कमांडों को रूट के रूप में चलाने के साथ उनके सामने अपना रास्ता बनाने की आवश्यकता है। Crontab में स्क्रिप्ट और लाइन संलग्न करने से मदद मिलेगी अन्यथा हम सिर्फ आपकी समस्या का अनुमान लगा रहे हैं
मीर बोर्ग

हाँ क्षमा करें। मैंने अभी किया।
user158335

यह विचार अच्छा नहीं है। सूचनाएं एक "जीयूआई" चीज हैं, क्रॉन एक "कंसोल" चीज है। कोई गौरक्षक नहीं है कि लिब-नोटिफिकेशन संदेश प्रदर्शित करने के लिए एक तरीका खोजने में सक्षम होगा। इसके बजाय आपको डेटा भेजने पर विचार करना चाहिए और क्रोन के संदेश को जानकारी भेजने का ध्यान रखना चाहिए। आम तौर पर एक ईमेल भेजा जाता है।
coteyr

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
क्या इसमें बिल्ली, wget, if, let, grep, इको आदि शामिल हैं?
user158335

7
अपने सिस्टम पर कम से कम, notify-sendपर है PATHएक क्रॉन जॉब के लिए भी। देखें मेरा उत्तर नीचे।
krlmlr

2
यह Ubuntu 17.04 के लिए समाधान नहीं है। इसके बजाय askubuntu.com/a/472769/413683 और askubuntu.com/a/834479/413683 देखें ।
मेटूस पिओत्रोस्की

2
यह समस्या नहीं है। समस्या यह है कि क्रोन स्क्रिप्ट उपयोगकर्ता सत्र के तहत नहीं चलती हैं, और उपयोगकर्ता के लॉगिन सत्र के वातावरण की कोई अवधारणा नहीं है। जैसा कि नोटिफिकेशन-भेजने के लिए अधिसूचना भेजने के लिए एक डबस सत्र बस से कनेक्ट करने की आवश्यकता होती है, इससे कोई फर्क नहीं पड़ेगा कि बाइनरी को किस मार्ग से बुलाया जाता है, जब यह सही सत्र बस से कनेक्ट नहीं होता है।
dobey

2
यह जवाब नहीं है। निश्चित रूप से, यदि निष्पादन योग्य स्थित नहीं हो सकता है, तो यह नहीं चलेगा, लेकिन: 1. नोटिफ़िकेशन भेज पाथ पर है इसलिए यह 2 स्थित होगा। भले ही यह पथ पर नहीं था, और आप इसे अभी भी पूर्ण पथ निर्दिष्ट करेंगे काम नहीं, क्योंकि वास्तव में DBUS_SESSION_BUS_ADDRESS को सूचना भेजने के लिए सेट किया जाना है। और सही उत्तर kmir से है।
क्रिस जैस

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, वातावरण चर के अनुसार DahitiF की टिप्पणी ubuntuforums.org पर। बस निम्नलिखित को अपने वास्तविक नौकरी विवरण में प्रस्तुत करें:

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

यह सेट करने के लिए आवश्यक नहीं लगता है DISPLAY


4
धन्यवाद, यह वही है जो आखिरकार मेरे लिए काम कर रहा है। Xubuntu पर, आपको बदलना gnome-sessionहोगा xfce4-session
श्रग

यह स्वीकार किए गए एक के स्पष्ट संकेत के साथ, 14.04 के लिए काम करने का एकमात्र उत्तर है।
Wtower

1
मुझे पता नहीं था gnome-sessionऔर इस्तेमाल gnome-shellके बजाय (सावधान रहना होगा वहाँ भी एक gnome-shell-calendar-serverतो pgrep2 पीआईडी की मिल जाएगा)। मुझे भी ज़रूरत थी DISPLAY=:0क्योंकि मैं 2 फ़िशिकल स्क्रीन का उपयोग कर रहा हूं और इसे परिभाषित नहीं किया गया था। धन्यवाद!
सोयाका

यदि आप ओपनबॉक्स (जैसे सीबी ++ पर) का उपयोग कर रहे हैं, तो इसके openboxलिए स्वैप करें gnome-session
ACK_stoverflow

यह सही उत्तर है, और स्वीकृत उत्तर भी सही नहीं है, यह DISPLAY चर के बारे में बात करता है, जिसकी आवश्यकता भी नहीं है, और न ही यह वास्तव में समस्या को हल करता है।
क्रिश जैस

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

Ubuntu 14.04 के लिए, कम से कम, ऊपर klrmr की प्रतिक्रिया सही उत्तर है। यह सूचित करने के लिए DISPLAY सेट करने या पूर्ण पथ को स्पष्ट रूप से दिखाने के लिए आवश्यक नहीं है, अन्यथा $ 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

यह वह समाधान था जो मेरे लिए भी पूरी तरह से काम करता था, मैंने अभी-अभी "eval ..." लाइन को अपनी स्क्रिप्ट में जोड़ा है जिसे मैं crontab से चलाता हूं - अब यह पूरी तरह से काम करता है
Mtl Dev

2

Ubuntu 16.04 के साथ मेरे मामले में किसी भी स्पष्ट मार्ग की आवश्यकता थी, मैं सिर्फ जोड़ने की समस्या को हल करता हूं

प्रदर्शन =: 0

कॉन्ट्राब की पहली पंक्तियों पर, कॉल-इन-नोटिफ़िकेशन भेजें।


यह 16.04 पर काम करने के लिए आवश्यक एकमात्र चीज है।
जोनाथन लैंड्रम

1

पहला अपराधी आपकी crontab फ़ाइल है, आपको उस उपयोगकर्ता नाम का भी उल्लेख करना होगा जिसके साथ स्क्रिप्ट को निष्पादित किया जाना है, बेहतर है इसे रूट के रूप में रखें

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

और फिर आपको स्क्रिप्ट के अंदर GUI उपयोगकर्ता के user_name का उपयोग करना चाहिए और इसे GUI का मालिक होने वाले उपयोगकर्ता के रूप में कमांड निष्पादित करने के लिए "sudo या 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+(काम नहीं करता है)
Onilton Maciel

इसे बेहतर कमांड के साथ तय किया
S471

1

जिस तरह से बाइनरी डबस एड्रेस को पुनः प्राप्त करता है, लगता है कि हाल ही में बदल गया है। उबंटू 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

इसे crontab में जोड़ें:

* * * * * $HOME/notify.sh

0

Ubuntu 15.10 पर काम करने के लिए इसे हमेशा के लिए ले लिया गया, उपयोगकर्ताओं को सामान्य env var प्राप्त करने के लिए एक स्रोत जोड़ना पड़ा। मेरा प्रदर्शन था: 1 किसी कारण के लिए भी। सूक्ति-सत्र के पहले परिणाम का उपयोग DBUS_SESSION_BUS_ADDRESS लुकअप के लिए किया जाता है।

# 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

मुझे यह सिर्फ निम्नलिखित नुस्खा का उपयोग करके Ubuntu 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

मुझे भी \ grep का उपयोग करना पड़ा क्योंकि मेरे grep को उपनाम दिया गया है

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

0

मैं Ubuntu 18.04 पर i3 का उपयोग करता हूं। इसे हल करने का मेरा तरीका है:

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


0

python3कॉस्टैब में UTF-8लोकेल के साथ कॉल करने के कारण समस्या ।

TL; DR: crontab w / लोकेल में उपसर्ग कॉल निम्नानुसार है:

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

क्लिक करके भी देखें python3 :

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

सभी crontab स्क्रिप्ट के लिए जो 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 की आवश्यकता है। दोनों को कमांड बलो में बदलें।

सिस्टमड के साथ समाधान

/etc/systemd/system/opreminder.service #Service फ़ाइल

[Unit]
Descrption=some service to run

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


/etc/systemd/system/opreminder.timer #timer फ़ाइल

[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_programming

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.