Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/07/2024, à 17:42

Gregory_007

[Résolu] Exécuter un environnement virtuel

Bonjour à tous et merci d'avance pour votre aide.

J'ai demandé  de l'aide sur un autre forum, mais je n'ai pas de réponse me permettant de régler mon problème. J'ai essayé tellement de truc que je ne sais plus comment bien décrire la situation.

Je suis sous Ubuntu sur un VPS ou je me connecte en SSH.

J'ai 3 scripts : DEMARRAGE.py, UTILISATEURS.py, CAPTEURS.py et DATABASES.py

UTILISATEURS utilisent Flask
CAPTEURS mqtt paho
DATABASES mysqlconnector

UTILISATEURS et CAPTEURS import DATABASES

DEMARRAGE est mon code qui doit démarrer l'ensemble de mes scripts au démarrage sous crontab

crontab -e
@reboot python3 /home/iot_devices/DEMARRAGE.py

DEMARRAGE.py  (il y a surement une autre façon de faire, mais c'est celle qui m'a permit d'avancer un peu)

import subprocess
import time
import os
 
def DIRECTION(DIR):
    os.chdir(DIR)
 
 
DIRECTION('/home/iot_devices')
CMD = 'source .venv/bin/activate; python3 CAPTEURS.py &'
subprocess.call(CMD,shell=True,executable='/bin/bash')
CMD = 'source .venv/bin/activate; python3 UTILISATEURS.py'
subprocess.call(CMD,shell=True,executable='/bin/bash')

Cela ne fonctionne pas totalement. DATABASES ne démarre pas. Je le sais car :

#1 en me reconnectant au SSH après le redémarrage, je ne peux plus démarrer les scripts :
* Serving Flask app 'UTILISATEURS'
* Debug mode: off
Address already in use
Port 5000 is in use by another program. Either identify and stop that program, or start the server with a different port.

#2 je les retrouve dans les processus actifs avec ps -ef (sauf DATABASES)

#3 Dans le script CAPTEURS.py, j'utilise une commande mqtt pour que le script me retourne une valeur. Cela fonctionne.

Si je démarre manuellement, je fais :

root@ubuntu:/home/iot_devices# python3 DEMARRAGE.py

tout démarre correctement.

En résumé, mes scripts ne démarrent pas totalement automatiquement et je ne sais pas pourquoi.

Est-ce qu'il y a un moins de ne plus être dans un environnement virtuel ? ca me créer beaucoup de soucis pour pas grand chose.

Qu'est-ce qui ne fonctionne pas ?

Merci

Dernière modification par Gregory_007 (Le 22/07/2024, à 16:23)

Hors ligne

#2 Le 12/07/2024, à 23:43

jplemoine

Re : [Résolu] Exécuter un environnement virtuel

Déjà, il faudrait que tes scripts se déversent dans un fichier log (sortie + erreur)
Et comme tu ne donnes pas les retours complets, on ne peut pas savoir avec quel utilisateur, ils sont lancés via cron.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 22/07/2024, à 15:21

victorema

Re : [Résolu] Exécuter un environnement virtuel

Bonjour,

Je rejoins ce qu'a dis jplemoine, sans les logs ça va etre difficile de t'aider vraiment...

Deja est-ce un crontab niveau utilisateur ou le crontab général niveau root qui est utilisé?
Souvent ce qui pose pb dans les cron et crontab ce sont les accès au PATH qui ne sont pas définis correctement, ce qui fait que ton script (ou plutot les commandes dans ton script) ne fonctionnent pas car elles sont introuvables lors de l'execution (faute de savoir chercher). Cest un classique en shell, il faut tjrs penser a redéfinir le PATH (export PATH=/bin,/sbin,/usr/bin,/usr/sbin,...) au début des cron pur éviter ce type de problème. Je ne dis pas que ton soucis vient obligatoirement de ça mais c'est un classique a vérifier en tout cas wink

Hors ligne

#4 Le 22/07/2024, à 15:26

xubu1957

Re : [Résolu] Exécuter un environnement virtuel

Bonjour,

Le 29/03/2018, moko138 a écrit :

Un retour complet doit contenir toutes les lignes,
depuis celle, entière, de la commande
jusqu'à la ligne attendant la commande suivante
, exemple :

moi@mon-pc~$: ma-commande
son retour
moi@mon-pc~$:

Faute de quoi, il manque souvent à ceux qui tentent de t'aider des éléments essentiels.

(Plus de détails dans ce message-ci Retour utilisable de commande.)

Et si tu ne veux pas divulguer ton nom d'user, tu le remplaces par "toto" ou ce que tu veux.


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

Hors ligne

#5 Le 22/07/2024, à 15:42

jplemoine

Re : [Résolu] Exécuter un environnement virtuel

victorema a écrit :

Cest un classique en shell, il faut tjrs penser a redéfinir le PATH (export PATH=/bin,/sbin,/usr/bin,/usr/sbin,...) au début des cron pur éviter ce type de problème.

L'autre solution (que je préfère) est d'utiliser des chemins absolus.
Je pense (mais je peux me tromper) que redéfinir le path peut avoir des effets de bords.
Par exemple, 2 fichiers ont le même nom mais pas le même contenu : en fonction du path, on aura l'un ou l'autre des fichiers.
Mais c'est une bonne piste : le fichier est non trouvé.

crontab -e
@reboot python3 /home/iot_devices/DEMARRAGE.py

1 - on met un fichier dans /etc/cron.d
2 - Par convention : Les fichiers en linux sont en minuscules : DEMARRAGE.py --> demarrage.py (*)
2 - dans ce fichier, la commande devient

@reboot <utilisateur> python3 /home/iot_devices/demarrage.py > /varlog/fichier.log 2>&1

A adapter :
- en fonction de la vraie valeur de <utilisateur>.
- Si utilisateur est un utilisateur classique et pas root, il peut y avoir des problèmes de droits d'écriture. Il faut alors créer un répertoire dans /var/log avec les "bons" droits
2>&1 permet de rediriger la sortie "erreur" dans la sortie "classique". On aura donc la même chose dans le fichier que l'on aurait à l'écran avec un lancement interactif.

(*) Linux étant case sensitive. On peut avoir plusieurs fichiers avec le même nom dans le même répertoire s'il n'ont pas la même case.
Par exemple  : demarrage.py, Demarrage.py et DEMARRAGE.py

Dernière modification par jplemoine (Le 22/07/2024, à 15:43)


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#6 Le 22/07/2024, à 16:21

Gregory_007

Re : [Résolu] Exécuter un environnement virtuel

Bonjour et merci pour vos réponses.

Je suis désolé du délai pour faire le suivi. Vos réponses mon permit de faire fonctionner mes scipts.

J'avais effectivement un problème dans un script python. Celui-ci était exécuté avant que le service mysql soit démarré. C'est pour cela que le script fonctionnait totalement en manuel et partiellement au démarrage. Le log m'a permit de trouver le problème.

Pour finir, voici la solution finale, peut-être que cela pourra aider une autre personne :
Dans crontab -e

@reboot /home/iot_devices/start_utilisateurs.sh
@reboot /home/iot_devices/start_capteurs.sh

Puis pour lancer les scripts python:

python3 /home/iot_devices/UTILISATEURS.py > /home/utilisateurs_script.log 2>&1
python3 /home/iot_devices/CAPTEURS.py > /home/utilisateurs_script.log 2>&1

Merci encore pour votre soutient.

Hors ligne

#7 Le 22/07/2024, à 16:48

jplemoine

Re : [Résolu] Exécuter un environnement virtuel

Je vois que tu as bien suivi mes préconisations (qui sont celles officielles)... Ca fait plaisir d'avoir pris le temps de rédiger pour rien.
Donc, pour ceux qui voudrait d'en inspirer...(non testé. Donc, certainement à ajuster)

On ne code plus dans crontab -e mais dans /etc/cron.d.
- créer un fichier (toto par exemple) dans /etc/cron.d
- mettre le contenu suivant (on imagine que iot_devices est l’utilisateur qui lance les scripts) :

@reboot iot_devices /home/iot_devices/start_utilisateurs.sh  > /var/log/iot_log/utilisateurs_script.log 2>&1
@reboot iot_devices /home/iot_devices/start_capteurs.sh > /var/log/iot_log/capteurs_script.log 2>&1

Pour les logs :
- créer un répertoire iot_log (par exemple)
- donner les droits d'écriture à iot_devices
-

chown root:iot_devices

-

chmod 775 /var/log/iot_log
/usr/bin/python3 /home/iot_devices/UTILISATEURS.py > /var/log/iot_log/utilisateurs_script_py.log 2>&1
/usr/bin/python3 /home/iot_devices/CAPTEURS.py > /var/log/iot_log/utilisateurs_script_py.log 2>&1

Comment sont lancés les scripts ?

Dernière modification par jplemoine (Le 22/07/2024, à 16:52)


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne