J'utilise Arch Linux avec KDE / Awesome WM. J'essaie
notify-send
de travailler avec cron
.
J'ai essayé de définir DISPLAY
/ XAUTHORITY
variables et de courir notify-send
avec "sudo -u", le tout sans résultat.
Je peux appeler notifier-envoyer de manière interactive depuis la session et recevoir des notifications.
FWIW, le travail cron fonctionne correctement, ce que j'ai vérifié en faisant écho à un fichier temporaire. C'est juste le "notify-send" qui ne fonctionne pas.
Code:
[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 ~]$
Comme vous pouvez le voir, l'écho avant et après notification-envoi a fonctionné.
J'ai aussi essayé de réglerDISPLAY=:0.0
MISE À JOUR: J'ai cherché un peu plus et j'ai constaté que DBUS_SESSION_BUS_ADDRESS doit être défini. Et après avoir codé en dur cela en utilisant la valeur que j'ai obtenue de ma session interactive, le minuscule petit message "bonjour" a commencé à apparaître à l'écran toutes les minutes!
Mais le hic, c'est que cette variable n'est pas permanente pour ce poste, je vais donc essayer la solution de tuyau nommée suggérée ici.
[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
Étant donné cron
que ne semble pas prendre en charge la notification-envoi (du moins pas directement), existe-t-il un autre système de notification plus cron
convivial que je peux utiliser?
&>>/tmp/crontest
à la ligne d'envoi de notification et voyez sinotify-send
donne des messages d'erreur.Réponses:
Vous devez définir la
DBUS_SESSION_BUS_ADDRESS
variable. Par défaut, cron n'a pas accès à la variable. Pour y remédier, placez le script suivant quelque part et appelez-le lorsque l'utilisateur se connecte, par exemple en utilisant awesome et larun_once
fonction mentionnée sur le wiki. N'importe quelle méthode fera l'affaire, car elle ne nuit pas si la fonction est appelée plus souvent que nécessaire.Cela crée un fichier contenant la variable d'environnement Dbus requise. Ensuite, dans le script appelé par cron, vous importez la variable en recherchant le script:
Voici une réponse qui utilise le même mécanisme.
la source
Vous devez définir les variables dans la crontab elle-même:
Pas
sudo
nécessaire, du moins pas sur mon système.la source
Le moyen le plus sûr d'obtenir des variables d'environnement liées à la session X est de les extraire de l'environnement d'un processus de l'utilisateur connecté à X. Voici une adaptation du script que j'utilise exactement dans le même but (bien que DBUS_SESSION_BUS_ADDRESS ne le fasse pas) semble être un problème pour moi sur Debian):
Cela envoie un message au premier utilisateur X qu'il trouve, bien que vous puissiez ajouter une boucle pour l'envoyer à tous les utilisateurs.
Mise à jour
Il semble que les mises à jour du format utmp provoquent l'
who
impression d'un affichage au lieu d'un tty dans sa deuxième colonne. En fait, cela facilite les choses, auparavant, il n'imprimait que l'affichage dans le commentaire à la fin et j'ai décidé que ce n'était pas sûr de s'appuyer sur la réponse originale. Si tel est le cas, essayez ceci:la source
who_line
commande. La sortie ressembleme :0 2015-09-23 10:40 ? 17234
.Ce one-liner a fonctionné pour moi à Manjaro avec Cronie:
Sans le très laid DBUS_blah_blah, cela ne fonctionne pas du tout. J'ai aussi trouvé
journalctl -xb -u cronie
utile. Je ne connais pas encore Cronie, mais j'ai créé mon "crontab" en tant que/etc/cron.d/mycronjobs
et je ne sais pas si ce nom de fichier est requis, ou s'il lit tout dans le répertoire cron.d.J'ai trouvé la solution ici https://wiki.archlinux.org/index.php/Desktop_notifications
la source
J'utilise i3 sur Ubuntu 18.04. Ma façon de résoudre ce problème est la suivante:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
la source
C'est suffisant pour faire fonctionner notifier-envoyer pour moi dans un cronjob sur Ubuntu Trusty:
Il exporte simplement le
DISPLAY
pour l'utilisateur sous lequel le cronjob s'exécute. Cela fonctionne pour moi sans réglageXAUTHORITY
niDBUS_SESSION_BUS_ADDRESS
.la source
Pour ceux sous Linux qui sont à l'aise pour installer des packages Python, je viens de publier un programme notify-send-headless qui fonctionne bien pour moi. Il recherche
/proc
le nom d'utilisateur et les variables d'environnement requis, puis s'exécutenotify-send
avec ces variables (il utiliserasudo
pour basculer vers l'utilisateur requis si nécessaire).la source
Vous pouvez également créer un script:
Ensuite, exécutez-le avec
sudo
. Cependant, puisquecrontab -e
exécute toutes les commandes avec l'utilisateur qui l'a créé, les éléments suivants devraient suffire lorsqu'ils sont appelés sanssudo
:Au moins, c'est le cas pour moi. Tout semble dépendre de la configuration de l'environnement.
la source
J'utilise ce script dans cron pour publier MPD en train de jouer sur twitter toutes les heures
script similaire utilisant notify-send
vous pouvez rencontrer des problèmes car KDE utilise son propre IIRC de notification-démon.
la source
Pour ce que ça vaut ...
J'ai dû utiliser TOUS les éléments suivants sur Debian Jessie pour que cela fonctionne ...
L'omission de l'un de ces éléments l'a empêché de fonctionner.
la source
*-0
dans votresession-bus
répertoire. Vous auriez peut-être voulu diresource "$HOME"/.dbus/session-bus/*-0
.Utilisation de sudo:
Pointe :
Nous pouvons obtenir l'utilisateur x actuel par cette commande
En plus...
Bon à savoir :
Cron fonctionnant sous root n'a pas accès à x donc toutes les commandes gui ne seront pas affichées, une solution simple est d'ajouter root à l'utilisateur x autorisé pour l'utilisateur x actuel avec cette commande
à partir du shell utilisateur x
ou
la source
Voici un script moins complexe que celui fourni par Graeme. Son script ne fonctionnait pas pour moi,
$who_line
était toujours vide. Mon script ne perd pas autant de temps à trouver un processus. Au lieu de cela, il essaie tout simplement et sélectionne la dernière valeur utile trouvée. J'exécute xubuntu 14.04 et j'ai quelques conteneurs lxc en cours d'exécution qui confondent probablement ce genre de scripts.la source
DBUS_SESSION_BUS_ADDRESS
. Je peux l'obtenir de mes shells, mais pas du processus Xorg.