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.
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:
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:
/tmp/sample_script.sh
(sera supprimé au redémarrage)chmod +x /tmp/sample_script.sh
/tmp/sample_script.sh
/tmp/sample_script.sh "message to send"
(notez que nous passons l'argument de chaîne, "message to send", ici).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.