Script python tmux & cron

Bonjour, je n’arrive pas à faire fonctionner mon script python pour redemarrer mes scripts en cas de coupure sur le serveur , j’ai configuré une tache cron qui execute le script toute les 15mins , dans le script j’utilise tmux pour garder la session ouverte pour garder mes scripts actif cest pour 2 bots telegrams, le probleme c’est quand je fais python3 redemarrage_scripts.py manuellement le script demarre bien , je pense bien utiliser tmux dans l’environnement virtuel python pour avoir les dependances nécessaires mais les bots ne fonctionne pas , je ne comprends ce qui passe dans les logs j’ai aucune erreur . Je tiens à preciser que quand je demarre les fichiers separements , ils fonctionnent bien dans le telegram , le script doit avoir un soucis mais je n’arrive pas à comprendre , pouvez vous m’éclairer ? , merci à vous

# Python 3.11.5 /

import datetime

import subprocess

import logging

# Configurez le logging pour écrire dans un fichier

logging.basicConfig(filename='scripts.log', level=logging.INFO, format='%(asctime)s - %(message)s')

# Chemin de l'environnement Python

env_path = "/web/bot-telegram/monenv/bin/activate"

logging.info("Début de l'exécution du script")

# Vérifier si tmux est en cours d'exécution

if subprocess.run(['pgrep', '-f', 'tmux'], stdout=subprocess.DEVNULL).returncode != 0:

    # tmux n'est pas en cours d'exécution, le démarrer

    logging.info("Démarrage de tmux")

    subprocess.Popen(['tmux', 'new-session', '-d', '-s', 'my_session'])

# Vérifier si l'environnement virtuel est actif avant de l'activer

if subprocess.run(['pgrep', '-f', 'activate'], stdout=subprocess.DEVNULL).returncode != 0:

    logging.info("Activation de l'environnement virtuel...")

    subprocess.Popen(['tmux', 'send-keys', '-t', 'my_session', f'source {env_path}', 'C-m'])

else:

    logging.info("Environnement virtuel déjà actif")

# Redémarrer les scripts

scripts = ['cellulegroup_group_order_bot.py', 'cellulegroup_countdown_bot.py']

# Vérifier si les scripts sont en cours d'exécution

for script in scripts:

    if subprocess.run(['pgrep', '-f', script], stdout=subprocess.DEVNULL).returncode != 0:

        # Le script n'est pas en cours d'exécution, le redémarrer

        logging.info(f"Redémarrage du script {script}")

        # Exécutez le script à l'intérieur de la session tmux

        subprocess.Popen(['tmux', 'send-keys', '-t', 'my_session', f'python3.11 {script}', 'C-m'])

    else:

        logging.info(f"Le script {script} est déjà en cours d'exécution")

Bonjour,
Voici mes suggestions :

  • tu as 2 scripts Python pour 2 bots Telegram. Cela demanderait donc d’avoir 2 tâches de fond/services/daemons différents

  • pour qu’un script Python puisse se lancer facilement, comme n’importe-quel autre script shell, il faut :

    • utiliser un shebang. Dans le cas de ton virtualenv, il faut que la toute première ligne du fichier contienne cela :
#!/web/bot-telegram/monenv/bin/python
    • que l’utilisateur amené à lancer le fichier ai les droits de lecture et d’exécution sur ke fichier
  • que ce soit sous Linux ou autre système, un programme qui tourne en arrière-plan, on en fait un service / daemon. Il faudrait donc que tu regardes comment créer un service avec Systemd.
    En plus de pouvoir lancer tes scripts lors du boot, cela aurait l’avantage qu’un programme/script lancé par Systemd n’a pas forcément à se préoccuper des logs vu que Systemd peut prendre la sortie du programme pour en faire un log, automatiquement.
    Systemd peut aussi relancer automatiquement un programme qui se serait crashé

  • pour obtenir le PID d’un processus qui tourne en tâche de fond, il est préconisé d’avoir un fichier du genre /var/run/order_bot.pid , dont le contenu est le PID du programme.
    Là aussi, Systemd peut aider

merci pour votre retour,

alors j’ai suivis vos recommandations j’ai créé les 2 fichiers pid et les 2fichiers system md

[Unit]
Description= CelluleGroup Countdown Bot Service
After=network.target

[Service]
ExecStart=/web/bot-telegram/monenv/bin/python3.11 /var/www/clients/client1/web1/web/bot-telegram/cellulegroup/cellulegroup_countdown_bot.py
WorkingDirectory=/var/www/clients/client1/web1/web/bot-telegram/cellulegroup/
PIDFile=/var/run/python_scripts/cellulegroup_countdown_bot.pid
Restart=always
User=web1

[Install]
WantedBy=multi-user.target

par contre je pense avoir un soucis de droit dans mon repertoire web1

voici l’erreur que j’ai :

Sep 18 12:35:22 ns3076842.ip-147-135-137.eu systemd[31966]: cellulegroup_countdown_bot.service: Failed to execute command: No such file or directory
Sep 18 12:35:22 ns3076842.ip-147-135-137.eu systemd[31966]: cellulegroup_countdown_bot.service: Failed at step EXEC spawning /web/bot-telegram/monenv/bin/python: No such file or directory
Sep 18 12:35:22 ns3076842.ip-147-135-137.eu systemd[1]: cellulegroup_countdown_bot.service: Main process exited, code=exited, status=203/EXEC
Sep 18 12:35:22 ns3076842.ip-147-135-137.eu systemd[1]: cellulegroup_countdown_bot.service: Failed with result 'exit-code'.
Sep 18 12:35:23 ns3076842.ip-147-135-137.eu systemd[1]: cellulegroup_countdown_bot.service: Service RestartSec=100ms expired, scheduling restart.
Sep 18 12:35:23 ns3076842.ip-147-135-137.eu systemd[1]: cellulegroup_countdown_bot.service: Scheduled restart job, restart counter is at 2.
Sep 18 12:35:23 ns3076842.ip-147-135-137.eu systemd[1]: Stopped CelluleGroup Countdown Bot Service.
Sep 18 12:35:23 ns3076842.ip-147-135-137.eu systemd[1]: Started CelluleGroup Countdown Bot Service.

Un exemple :

$ sudo apt update
$ sudo apt install python3-pip python3-virtualenv
$ sudo mkdir -p /web/test-python
$ sudo chown user:user /web/test-python
$ cd /web/test-python/
$ python3.11 -m virtualenv monenv
created virtual environment CPython3.11.2.final.0-64 in 161ms
  creator CPython3Posix(dest=/web/test-python/monenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/user/.local/share/virtualenv)
    added seed packages: pip==23.0.1, setuptools==66.1.1, wheel==0.38.4
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
$ source monenv/bin/activate
(monenv) user@bworm:/web/test-python$ which python
/web/test-python/monenv/bin/python
$ python -m pip install --upgrade pip
Requirement already satisfied: pip in ./monenv/lib/python3.11/site-packages (23.0.1)
...
Successfully installed pip-23.2.1
$ pip install colorama
...
Successfully installed colorama-0.4.6
$ deactivate
user@bworm:/web/test-python$ mkdir script1
$ cd script1
user@bworm:/web/test-python/script1$ realpath -s ../monenv/bin/python3.11
/web/test-python/monenv/bin/python3.11
$ vi nesertarien.py
$ chmod +x nesertarien.py
$ ./nesertarien.py
Je démarre.
Il est 18:21:55
Il est 18:22:10
^CJe m'arrête.
$ mkdir ../work
$ realpath -s nesertarien.py
/web/test-python/script1/nesertarien.py
$ sudo vi /etc/systemd/system/Toto.service
$ sudo systemctl daemon-reload
$ sudo systemctl start Toto.service
$ sudo journalctl --no-pager --follow --unit=Toto.service
Sep 18 18:27:06 bworm systemd[1]: Started Toto.service - script inutile.
Sep 18 18:27:06 bworm nesertarien.py[72643]: Je démarre.
Sep 18 18:27:06 bworm nesertarien.py[72643]: Il est 18:27:06
Sep 18 18:27:21 bworm nesertarien.py[72643]: Il est 18:27:21
Sep 18 18:27:36 bworm nesertarien.py[72643]: Il est 18:27:36
^C
$ systemctl show --property MainPID Toto.service
MainPID=72558

/web/test-python/script1/nesertarien.py :

#!/web/test-python/monenv/bin/python3.11 -u

import colorama
import time
from datetime import datetime
import sys

print("Je démarre.")
while True:
    try:
        print("Il est {}".format(datetime.now().strftime("%H:%M:%S")))
        time.sleep(15)
    except KeyboardInterrupt:
        print("Je m'arrête.")
        sys.exit(0)

/etc/systemd/system/Toto.service :

[Unit]
Description=script inutile
After=network.target

[Service]
ExecStart=/web/test-python/script1/nesertarien.py
WorkingDirectory=/web/test-python/work/
Restart=always
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

c’est parfait tout fonctionne , merci beaucoup pour votre aide