# Script python tmux & cron

**URL:** <https://www.debian-fr.org/t/script-python-tmux-cron/88804>\
**Category:** Programmation\
**Created:** [Septembre 15, 2023, 7:06 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804 "2023-09-15T19:06:40Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mikka66](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mikka66/32/10134_2.png) [@mikka66](https://www.debian-fr.org/u/mikka66)\
**Post date:** [Septembre 15, 2023, 7:06 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804/1 "2023-09-15T19:06:40Z")

</div>

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
# 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")

```

---

<div class="post-metadata">

**Author:** ![AnonymousCoward](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f9ae1b/32.png) [@AnonymousCoward](https://www.debian-fr.org/u/AnonymousCoward)\
**Post date:** [Septembre 15, 2023, 10:12 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804/2 "2023-09-15T22:12:56Z")

</div>

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 :

```auto
#!/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

---

<div class="post-metadata">

**Author:** ![mikka66](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mikka66/32/10134_2.png) [@mikka66](https://www.debian-fr.org/u/mikka66)\
**Post date:** [Septembre 18, 2023, 11:10 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804/3 "2023-09-18T11:10:57Z")

</div>

merci pour votre retour,

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

```nohighlight
[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 :

```nohighlight
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.

```

---

<div class="post-metadata">

**Author:** ![AnonymousCoward](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f9ae1b/32.png) [@AnonymousCoward](https://www.debian-fr.org/u/AnonymousCoward)\
**Post date:** [Septembre 18, 2023, 5:46 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804/4 "2023-09-18T17:46:42Z")

</div>

Un exemple :

```nohighlight
$ 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` :

```python
#!/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` :

```nohighlight
[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

```

---

<div class="post-metadata">

**Author:** ![mikka66](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mikka66/32/10134_2.png) [@mikka66](https://www.debian-fr.org/u/mikka66)\
**Post date:** [Septembre 18, 2023, 8:00 UTC](https://www.debian-fr.org/t/script-python-tmux-cron/88804/5 "2023-09-18T20:00:24Z")

</div>

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