web-dev-qa-db-fra.com

script lancé à partir de la règle udev ne s'affiche pas dans le terminal?

J'ai créé un script pour exécuter rsync et ajouté read line à la fin pour que le résultat soit visible après son exécution. cela fonctionne comme prévu lorsque j'exécute le script manuellement.

J'ai créé une règle udev RUN+="/home/user/bin/scriptfile" pour exécuter le script ci-dessus et le script s'exécute comme prévu, mais la sortie ne s'affiche pas dans une fenêtre de terminal. Pourquoi pas et comment puis-je le faire?

edit - pour clarifier: j’ai essayé d’initier différents scripts à partir de règles udev, et cela fonctionne très bien, les scripts s’exécutent et font ce que j’attends d’eux. La question est, puis-je avoir la sortie imprimée sur mon écran quand un script est exécuté. Je peux diriger la sortie vers un fichier journal, cela fonctionne aussi, mais j'aimerais que ce soit visible à l'écran lorsque le script est en cours d'exécution.

4
kurja

Tout d’abord, pourquoi ne voyez-vous pas la sortie? Comme l'a souligné Sergiy Kolodyazhnyy dans les commentaires, les scripts lancés par udev "n'héritent pas des mêmes variables d'environnement, ce qui signifie qu'ils n'ont aucun moyen de savoir où et quelle session de l'interface graphique vous exécutez". En termes plus simples, udev est ignorant en ce qui concerne l'interface graphique de votre ordinateur de bureau.

Je fais actuellement quelque chose de similaire à ce que vous avez demandé pour les périphériques USB branchés sur mon système. Pour une application en cours d'exécution, j'ai besoin de savoir si le numéro de série de l'USB est valide. Quoi qu'il en soit, voici comment j'ai réussi.

Aperçu:

  • Je lance un script d'assistance qui crée un canal nommé et surveille ce canal nommé pour détecter les "messages" qui le traversent.
  • Udev est configuré pour "envoyer des messages" (lignes d'écriture) à mon canal nommé (dans mon cas, les informations de partition et de clé USB).
  • Mon script d'assistance voit chaque ligne de texte entrer et j'utilise notify-send pour transférer le message sur mon écran sous la forme d'une notification.

Si vous voulez simplement le voir dans une fenêtre de terminal, vous pouvez dire à votre script d'assistance de simplement faire écho au texte du canal nommé dans la fenêtre de terminal.


Exemple de code:

#!/bin/bash
#This script should be called once without an argument to get it running in a "service" mode
#Successive calls to this script by UDEV sould pass a string as the first argument.
#   These strings will then be displayed in the window running in service mode.

pipe=/tmp/messages

if [ "$1" == "" ]; then

    [ ! -e  "$pipe" ] && mkfifo "$pipe"

    while true # this loop continuously reads new lines and echos them
    do
        line=$(cat "$pipe")
        echo "$line"
    done
fi

# you won't reach this line unless you call this script with one argument
echo "$1" >> "$pipe"

Lancer ce script:

  • Enregistrez ce qui précède dans un fichier /tmp/sample_script.sh (sera supprimé au redémarrage)
  • Rendre le script exécutable chmod +x /tmp/sample_script.sh
  • Appelez le script pour le faire fonctionner en mode service (c'est-à-dire sans aucun argument) /tmp/sample_script.sh
  • Depuis une autre fenêtre de terminal/script/udev, exécutez /tmp/sample_script.sh "message to send" (notez que nous passons l'argument de chaîne, "message to send", ici).
  • Retournez à la fenêtre de service et vous verrez que la chaîne "message à envoyer" est apparue dans la fenêtre.

Lorsque vous exécutez le script depuis udev, vous ne pourrez pas obtenir directement la seconde instance à l'écran sans la rediriger via le tube nommé, car votre script udev est appelé depuis un environnement complètement séparé de l'environnement de votre interface graphique. est en cours d'exécution. Le canal nommé créé dans le script et utilisé dans les deux environnements agit comme un pont entre les deux, vous permettant de transmettre des informations de l'environnement udev à l'environnement d'interface graphique que vous consultez.

5
b_laoshi