[résolu] Systemd renoit CANNOT OPEN DISPLAY pour un service de lancement


#1

bonjour,
voilà après 8 jours de bataille, qui m’ont permis de de comprendre systemd, du moins le commande load deamon, systemct start enable status reload etc qui m’ont permis de faire un plein de tests … je butte toujours (cf les log cidessous) : le lancement par /etc/rc.local dans un terminal est parfait … par contre systemd avec le service ci dessous bloque quand il rencontre ma demande de termminal pour mon script python interactif avec la raison “CANNOT OPEN DISPLAY” ( par contre il exécute bien dans le terminal de log la publication de l’adresse IP) … merci de vos idées …

j’ai rebranché clavier et écran sur la raspberry 3 sous rasbian et j’ai bien obervé qu’après ctrl alt/F1 je quittais l’interface ( plus de souris ;;;; mais pas de trace de mon programme pyhton input/ print) graphique et pour y revenir sans problème par F7

pour rappel voici le service dans lequel je commente Display ou non de même pour les référence à tty1 ça chage pas le résultat “CANOT OPEN DISPLAY”

[Unit]
Description= rc-local.service
Wants=graphical.target

[Service]
#DISPLAY=:0.0
User=pi
Type=forking
StandardInput=tty1
StandardOuput=tty1
TTYPath=/dev/tty1
ExecStart=/etc/rc.local

[Install]
WantedBy=multi-user.target

----------------------------------------------------------- avec le rc.local qui fonctionne parfaitement par /etc/rc;local dans un terminal il ouvre un autre terminal

This script is executed at the end of each multiuser runlevel.

Make sure that the script will “exit 0” on success or any other

Print the IP address

_IP=$(hostname -I) || true
if [ “$_IP” ]; then
printf “My IP address is %s\n” “$_IP”
fi

lxterminal --geometry=80x25 --title=robot -e bash -c “/usr/bin/python3.5 /home/pi/Documents/robot/robot.py”

exit 0

-------------------------------------------- retour de sytemctl status
rc-local.service
Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset:
Drop-In: /lib/systemd/system/rc-local.service.d
└─debian.conf
Active: failed (Result: exit-code) since Thu 2019-01-17 20:25:45 CET; 1min 58

janv. 17 20:25:45 komputileto systemd[1]: Starting rc-local.service…
janv. 17 20:25:45 komputileto rc.local[1451]: My IP address is 192.168.1.96
janv. 17 20:25:45 komputileto lxterminal[1453]: cannot open display:
janv. 17 20:25:45 komputileto systemd[1]: rc-local.service: Control process exit
janv. 17 20:25:45 komputileto systemd[1]: Failed to start rc-local.service.
janv. 17 20:25:45 komputileto systemd[1]: rc-local.service: Unit entered failed
janv. 17 20:25:45 komputileto systemd[1]: rc-local.service: Failed with result ’
janv. 17 20:27:38 komputileto systemd[1]: [/etc/systemd/system/rc-local.service:
janv. 17 20:27:38 komputileto systemd[1]: [/etc/systemd/system/rc-local.service:

voilà donc je sèche toujours , merci de ton aide encore une idée ?


#2

Salut,

Je n’y connais rien en python, mais j’en ai fait un peu la semaine dernière.
Et je gère divers services en lancement automatique, alors je tente.
Et, au pire, je n’ai pas peur d’être contredit par plus compétent :slight_smile:

Si on bosse en mode console, on automatise en chargeant un script avant la séquence graphique.
Donc édition de rc.local avec sudo nano /etc/rc.local
On y insère sudo python3 /home/pi/script.py& ou sudo python /home/pi/script.py& (selon la version de python) juste avant la ligne # Print the IP address
Le fichier sera :

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sudo python3 /home/pi/script.py&
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0

Ensuite, création du script avec sudo nano /home/pi/script.py.
Et (je le fais, mais utile ?) application des droits avec sudo chmod +x /home/pi/script.py

Mon script démarre sans souci.

En version graphique (j’ai des Rpi en console et d’autres en graphique et même des script différentiels si console ou graphique) :

sudo nano /etc/xdg/lxsession/LXDE-pi/autostart

On ajoute python /home/pi/script.py à la dernière ligne.

Ça donne ça :

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
python /home/pi/script.py

Mais ton message Cannot Open Display, ce n’est pas un souci d’affichage ???
On dirait qu’il veut lancer un prog en mode graphique alors qu’il est en console.
Essaye de passer ton Rpi en mode graphique au démarrage pour voir si ça ne résoudrait pas le souci.

++


#3

merci nabla pour une telle réponse si rapide, je vais tester comme tu dis mais encore un conseil …
Commet fais tu pour lancer

“On dirait qu’il veut lancer un prog en mode graphique alors qu’il est en console.
Essaye de passer ton Rpi en mode graphique au démarrage pour voir si ça ne résoudrait pas le souci.”
je comprends pas comment faire, puisque quand je reboot je me retrouve toujours sur le bureau raspbian comme sis de rien n’était.


#4

Erreur de ma part.
je pensais que tu démarrais en mode console.
Donc ce n’est pas ça le souci.

Tu as installé bcp de truc ?
Parce que si tu veux juste lancer un script, autant repartir d’une install propre ou tu n’as rien tripatouillé (là, ça doit être le chantier).

Tu testes déjà ça :

sudo nano /etc/xdg/lxsession/LXDE-pi/autostart

puis :

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
python3 /home/pi/Documents/robot/robot.py

Pas besoin de faire un reboot ; un simple logout puis reconnexion suffit.

Tu veux juste lancer le script ou tu veux vraiment lancer un terminal pour lancer le script ?

Dans ce cas, tu peux tester ça :

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
@lxterminal –command=’python3 /home/pi/Documents/robot/robot.py’

ou
@lxterminal --command="./robot.py"

Sans oublier le sudo chmod +x /home/pi/Documents/robot/robot.py

++


#5

d’accord j’ai testé ta deuxième proposition car mon script de test très simplifié compte 2 print et un input donc il me faut un terminal pour l’interaction

Dans ce cas, tu peux tester ça :

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
@lxterminal –command=’python3 /home/pi/Documents/robot/robot.py’

le script ne se lance pas, par contre le log ne montre plus “Cannot open dysplay” c’est un bon début !
mais dis moi par quel mécanisme le fichier /etc/xdg/lxsession/LXDE-pi/autostart est til lancé ?
Tes conseils me poussent à désactiver le rc-local;service de systemd c’est bien ça ? pratique tu systemd où préconises tu l’abandonner ?
En tout cas je vois que mes tentative précédent parasite tout et donc je fais faire le ménage et reprendre tes propositions …
je te ferai un retour bien sûr merci


#6

Attention, je suis juste un mec normal, alors je suis loin d’être le plus pédagogue et/ou le plus compétent.

J’utilise systemctl pour MotionEye

J’utilise rc.local qd je veux que ça démarre “au démarrage”

Et j’utilise /etc/xdg/lxsession/LXDE-pi/autostart quand je veux que ça soit lancé après le démarrage de l’interface graphique

Par exemple, tu demandes à ton Rpi de démarrer en mode console.
Tu fais un script lancé par rc.local pour que ton Rpi dise “OK ; système en route”
Et tu fais un script qui dira “Mode Graphique activé” ; script lancé par /etc/xdg/lxsession/LXDE-pi/autostart

Tu démarres ; ça va dire “OK ; système en route” et c’est tout.
Mais si tu tapes startx, alors tu auras le droit à “Mode Graphique activé” une fois le Bureau chargé.

Bref, le but n’est pas le même.

++


#7

Tout ça est bien clair … je vais donc faire le ménage des Cron et autres autostart et revenir ta démarche qui balise bien les choix
Je me sens confiant reste plus qu’à réinstaller… merci


#8

salut salut victoire !
j’ai résolu le problème en suivant le conseil suivant … réinstaller ma rasbian car sans doute tous mes essais avaient semer la pagaille donc rasbian strecht “neuve”
et j’ai obtenu du premier coup le résultat rechercher

sudo geany (ou nano) /etc/xdg/lxsession/LXDE-pi/autostart

et en ajoutant

@lxterminal -e /usr/bin/python3.5 /home/pi/Documents/robot/vrairobot.py [/size] que vous adapterez en fonction de votre arborescence :slight_smile:

comme avant dernière ligne ;;; pour être précis avant donc
point-rpi

et voilà comme je sors de 8 jours de galère
un grand merci à ceux qui m’ont aidé. Merci à Nabla sur ce forum
une vrai petit tuto serai le bienvenu, car beaucoup de post raène à des solution obsolète ou à la discipline de systemd qui n’est absolument pas documenté pour un tel cas.


#9

Salut,

Tu peux insérer [Résolu] dans ton titre en éditant ton premier message ?

Tu as raison pour les tutos, on trouve de tout, mais c’est aussi parce que les services évoluent alors que les articles/tutos restent archivés (et pas toujours datés).
Le truc limitant peut aussi résider dans les mots clefs utilisés.
Tu mettrais quoi comme titre au tuto ?

(je t’envoie un Message Privé)


#10

voilà j’ai appris à mettre résolu dans le titre.

pour un tel tuto je verrai bien un titre comme

redémarrage d’un robot animé par Python sous Rasbian stretch

encore merci … actuellement ma raspi communique avec un wipy, un arduino nano, un gps, 2 magnetomètres donc j’ai pas mal de travail :slight_smile: