क्रोन के साथ सूचित-भेजने का उपयोग करना


32

मैं KDE / Awesome WM के साथ आर्क लिनक्स का उपयोग कर रहा हूं। मैं notify-sendकाम करने की कोशिश कर रहा हूं cron

मैंने सेटिंग DISPLAY/ XAUTHORITYचर की कोशिश की है , और notify-send"sudo -u" के साथ चल रहा है , सभी परिणाम के बिना।

मैं सत्र से अंतःक्रियात्मक रूप से सूचित-कॉल करने और सूचनाएं प्राप्त करने में सक्षम हूं।

एफडब्ल्यूआईडब्ल्यू, क्रोन जॉब ठीक चल रहा है जिसे मैंने एक अस्थायी फ़ाइल में सामान गूंज कर सत्यापित किया था। यह सिर्फ "सूचना-भेजें" है जो काम करने में विफल रहता है।

कोड:

[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

@terdon मैंने आपके समाधान की कोशिश की (बस एक त्वरित परीक्षण) और यह मेरे डेबियन सिस्टम पर काम करने लगता है। मैं जानना चाहता हूं कि क्या यह आम तौर पर लागू होता है क्योंकि यह वास्तव में सरल है।
मार्को

@ मर्को मैं LMDE (अनिवार्य रूप से डेबियन परीक्षण) पर हूँ और डे के रूप में दालचीनी का उपयोग कर रहा हूँ। आपको बता नहीं सकता कि यह उन से परे काम करता है।
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

यह एक फाइल बनाता है जिसमें आवश्यक डबस एवियारमेंट वैरिएबल है। फिर क्रोन द्वारा लिखी गई स्क्रिप्ट में आप स्क्रिप्ट को सोर्स करके वेरिएबल इम्पोर्ट करते हैं:

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

यहां एक उत्तर है जो समान तंत्र का उपयोग करता है।


1
मुझे यह देखकर खुशी हुई कि मैं समाधान के करीब था। धन्यवाद मार्को, यह साफ है!
justsomeone

महान, मैंने आपके उत्तर का पुन: उपयोग किया और यहां कुछ और विस्तृत निर्देश जोड़े: askubuntu.com/a/537721/34298
rubo77

क्या यह सुरक्षा जोखिम नहीं होगा? Security.stackexchange.com/questions/71019/…
rubo77


मैंने कई अन्य उत्तरों की कोशिश की है जिसमें ubuntu 15.10 पर DBUS शामिल है और कुछ भी काम नहीं किया है। यह एक सरल है और निर्दोष रूप से काम करता है।
Bastian

16

आपको चरों में चर को सेट करने की आवश्यकता है:

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

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

कोई sudoजरूरत नहीं , कम से कम मेरे सिस्टम पर नहीं।


आपके समय के लिए धन्यवाद टेराडॉन। यह एक सरल उपाय प्रतीत होता है। दुर्भाग्य से, यह मेरे लिए काम नहीं किया,
justsomeone

@justsomeone हुह, ठीक है, तब डेस्कटॉप वातावरण पर निर्भर हो सकता है।
terdon

मुझे लगता है कि यह डिस्ट्रो या डेस्कटॉप पर्यावरण के साथ कुछ करने के लिए मिला है। उबंटू उपयोगकर्ताओं के लिए, सीधे फॉरवर्ड सॉल्यूशन, जो मैंने ऑनलाइन फ़ोरम में देखे हैं, से ठीक काम करता है।
justsomeone

@justsomeone मैं डेबियन (LMDE) पर डे के रूप में दालचीनी का उपयोग कर रहा हूं। X कैसे शुरू किया जाए या DE, dunno द्वारा उपयोग किए जाने वाले नोटिफिकेशन सिस्टम के साथ कुछ करना हो सकता है।
terdon

इसकी पुष्टि उबंटू 14.04 / 14.10 पर करता है। GNOME और यूनिटी के साथ।
जॉर्डन बेडवेल

8

X सत्र से संबंधित पर्यावरणीय चर प्राप्त करने का सबसे सुरक्षित तरीका है कि उन्हें उस उपयोगकर्ता की प्रक्रिया के वातावरण से प्राप्त किया जाए जो X पर लॉग इन है। यहाँ स्क्रिप्ट का एक अनुकूलन है जो मैं बिल्कुल उसी उद्देश्य के लिए उपयोग करता हूं (हालांकि DBUS_SESSIONONUS_ADDRESS doesn ' टी मेरे लिए डेबियन पर एक समस्या लगती है):

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"

यह पहले X उपयोगकर्ता को मिलने वाले संदेश को भेजता है, हालाँकि आप इसे सभी उपयोगकर्ताओं को भेजने के लिए एक लूप जोड़ सकते हैं।

अद्यतन करें

ऐसा लगता है कि utmp प्रारूप के अपडेट के कारण whoइसके दूसरे कॉलम में एक tty के बजाय एक डिस्प्ले प्रिंट हो सकता है। यह वास्तव में चीजों को आसान बनाता है, पहले यह केवल टिप्पणी में प्रदर्शन को अंत में मुद्रित करता था और मैंने तय किया कि मूल उत्तर के लिए इस पर भरोसा करना सुरक्षित नहीं था। यदि यह मामला है, तो यह कोशिश करें:

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
ब्ल्यू ऑक्ट

1
@blujay, अपडेट किया गया।
ग्रीम

धन्यवाद, वह काम करता है। हालाँकि, जैसा कि मैंने एक अलग उत्तर में पोस्ट किया है, एक और भी सरल समाधान है।
ay१५

@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और मुझे यकीन नहीं है कि अगर फ़ाइल नाम की आवश्यकता है, या अगर यह सिर्फ cron.d निर्देशिका में सब कुछ पढ़ता है।

मुझे इसका हल मिला https://wiki.archlinux.org/index.php/Desktop_notifications


2

मैं Ubuntu 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

आपको केडीई के अपने स्वयं के अधिसूचित-बहरा IIRC का उपयोग करने के रूप में समस्याओं का सामना करना पड़ सकता है।


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 -u $currentxuser notify-send $message

टिप:

हम इस कमांड द्वारा वर्तमान x उपयोगकर्ता प्राप्त कर सकते हैं

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

जानकार अच्छा लगा :

जड़ के नीचे चलने वाले क्रोन में x तक पहुंच नहीं होती है, इसलिए सभी gui कमांड प्रदर्शित नहीं होंगे, एक सरल समाधान यह है कि इस कमांड के साथ वर्तमान x उपयोगकर्ता के लिए अधिकृत x उपयोगकर्ता में रूट जोड़ें

एक्स उपयोगकर्ता शेल से

xhost local:root

या

sudo -u $currentxuser xhost local:root

-1

यहां ग्रीम द्वारा प्रदान की गई तुलना में कम जटिल स्क्रिप्ट है। उनकी स्क्रिप्ट मेरे लिए काम नहीं करती $who_lineथी , हमेशा खाली रहती थी। मेरी स्क्रिप्ट प्रक्रिया खोजने में इतना समय बर्बाद नहीं करती है। इसके बजाय, यह बस सभी का प्रयास करता है और पाया गया अंतिम उपयोगी मूल्य चुनता है। मैं 14.04 xubuntu चल रहा हूं और कुछ 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"

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