Maison  >  Article  >  développement back-end  >  Comment configurer Selenium en tant que démon Linux avec systemd

Comment configurer Selenium en tant que démon Linux avec systemd

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-18 18:17:29429parcourir

How to Set Up Selenium as a Linux Daemon with systemd

Configurer et exécuter Chrome et Selenium sur Ubuntu ou Debian. Le guide est basé sur Ubuntu 22.04

Selenium est idéal pour automatiser les tâches Web, mais garder un bot fonctionnant 24h/24 et 7j/7 sur un serveur peut être délicat. En utilisant systemd, vous pouvez exécuter votre bot Selenium en tant que service d'arrière-plan (démon), garantissant qu'il fonctionne de manière fiable et redémarre en cas d'échec. Ce guide vous guidera à travers les étapes de configuration, en mettant l'accent sur sa configuration pour un VPS Linux.

Table des matières

  1. Installation de Google Chrome

  2. Mise en place de l'environnement virtuel

  3. Installation des packages nécessaires

  4. Création du script Python

  5. Configuration du service systemd

    • Ajout de variables ENV (facultatif)
    • Fichier de service
    • Exécuter le service
  6. Résolution des problèmes de mise en mémoire tampon des blocs

    • Utiliser l'indicateur -u
    • Utilisation de l'argument Print flush
  7. Accès aux journaux à l'aide de journalctl

  8. Références


Installation de Google Chrome

Tout d'abord, mettez à jour tous les packages.

sudo apt update

Téléchargez le package Google Chrome stable.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Installez Google Chrome.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Vérifiez la version de Google Chrome installée.

google-chrome --version

Mise en place de l'environnement virtuel

Ces étapes ne sont pas obligatoires si vous exécutez uniquement le bot Selenium sur votre machine. Cependant, cela est recommandé si vous travaillez sur d'autres projets ou si vous avez besoin d'environnements isolés.

Créons notre environnement virtuel.

python3 -m venv venv

Activez l'environnement virtuel.

source venv/bin/activate

Installation des packages nécessaires

Maintenant, installez Selenium et webdriver-manager.

pip install selenium
pip install webdriver-manager

Le but de webdriver-manger est de simplifier la gestion des pilotes binaires pour différents navigateurs. Vous pouvez en apprendre davantage dans sa documentation.


Création du script Python

## main.py

from selenium import webdriver
## ---- Use for type hint ---- ##
from selenium.webdriver.chrome.webdriver import WebDriver
## --------------------------- ##
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager


def create_chrome_web_driver_connection(headless: bool,
                                       detach:bool,
                                       use_sandbox: bool,
                                       use_dev_shm: bool,
                                       window_width: int = 1052,
                                       window_height: int = 825
                                       ) -> WebDriver:

    service = Service(ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option("detach", detach)
    options.add_argument(f"--window-size={window_width},{window_height}")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-renderer-backgrounding")
    options.page_load_strategy = 'normal'

    if not use_sandbox:
        options.add_argument('--no-sandbox')
    if not use_dev_shm:
        options.add_argument('--disable-dev-shm-usage')
    if headless:
        options.add_argument("--headless=new")

    driver = webdriver.Chrome(service= service, options=options)

    return driver



if "__main__" == __name__:
    driver =  create_chrome_web_driver_connection(headless= True,
                                                 detach= False,
                                                 use_sandbox= False,
                                                 use_dev_shm= False)

    driver.get('https://python.org')
    print(driver.title)

    driver.close()

options.add_experimental_option("detach", detach) :

  • Cela vous permet de configurer si le navigateur Chrome reste ouvert une fois l'exécution du script terminée.
  • Si detach est True, la fenêtre du navigateur restera ouverte même après la fin de la session WebDriver.

options.add_argument(f"--window-size={window_width},{window_height}") :

  • Cela définit la taille de la fenêtre du navigateur en termes de largeur et de hauteur.

Vous pouvez supprimer cette ligne si vous le souhaitez.
Si vous envisagez d'exécuter Selenium en mode sans tête, assurez-vous de définir la taille de la fenêtre de cette façon ; sinon, d'après mon expérience, la taille de la fenêtre par défaut pourrait être trop petite.

Vous pouvez vérifier la taille de votre fenêtre avec cette commande driver.get_window_size()

options.add_argument("--disable-extensions") :

  • Les extensions peuvent interférer avec les interactions automatisées du navigateur, leur désactivation peut donc améliorer la stabilité.

options.add_argument("--disable-renderer-backgrounding") :

  • Cela empêche Chrome de déprioriser ou de suspendre les onglets en arrière-plan.
  • Cela peut être utile lors de l'exécution d'actions sur plusieurs onglets.

options.page_load_strategy = 'normal' :

  • Cela définit la stratégie de chargement de la page sur normale, ce qui signifie que Selenium attendra que la page soit complètement chargée avant de passer à d'autres commandes.
  • D'autres options incluent impatient (attendre l'événement DOMContentLoaded) et aucun (ne pas attendre le chargement de la page), vous pouvez en savoir plus ici.

options.add_argument('--no-sandbox') :

  • Le bac à sable est une fonctionnalité de sécurité de Chrome qui isole les processus du navigateur.
  • Le désactiver (--no-sandbox) peut être utile dans certains environnements de test (par exemple, dans les conteneurs Docker ou lors de l'exécution du script en tant qu'utilisateur root) où le bac à sable provoque des problèmes d'autorisation ou des plantages.

options.add_argument('--disable-dev-shm-usage') :

  • /dev/shm est un espace mémoire partagé souvent utilisé dans les environnements Linux. Par défaut, Chrome essaie de l'utiliser pour améliorer les performances.
  • La désactivation de cette option (--disable-dev-shm-usage) peut éviter les plantages dans les environnements où la mémoire partagée est limitée.

options.add_argument("--headless=new") :

  • Cela active le mode sans tête, qui exécute Chrome sans interface graphique.
  • Le mode sans tête est utile pour fonctionner dans des environnements sans écran, tels que les pipelines CI/CD ou les serveurs distants.

Configuration du service systemd

Ajout de variables ENV (facultatif)

Si votre programme Selenium doit utiliser des variables d'environnement, vous pouvez y parvenir de deux manières :

  1. Utiliser un fichier .env avec une bibliothèque comme python-dotenv (la méthode la plus courante/populaire).

  2. Utilisation de l'option intégrée de systemd pour configurer un fichier d'environnement.

Pour cet exemple, nous utiliserons la deuxième option.

Tout d'abord, créons un répertoire conf.d dans le répertoire /etc.

sudo apt update

Ensuite, créez un fichier texte brut (ce sera notre fichier d'environnement).

sudo apt update

Vous pouvez maintenant ajouter vos variables d'environnement au fichier que nous venons de créer.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Modifiez le script Python pour utiliser les variables d'environnement.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Fichier de services

Vous devez créer un fichier de service dans ce répertoire /etc/systemd/system/ ; c'est ici que doivent être placées les unités systemd installées par l'administrateur système.

google-chrome --version

Pour cet exemple, je vais supposer que vous êtes dans un VPS et que vous souhaitez exécuter le service en tant qu'utilisateur root.

[!AVERTISSEMENT]
Le service fonctionnera avec les privilèges root (administrateur). Cela lui donne un accès complet au système, mais son exécution en tant que root est généralement évitée, sauf si cela est nécessaire pour des raisons de sécurité.

Ajoutez ceci au fichier de service.

python3 -m venv venv

Section [Unité]

Cette section définit les métadonnées et les dépendances du service.

Description=Selenium Bot Service : Fournit une brève description de ce que fait le service. Dans ce cas, il le décrit comme le « service Bot Selenium ». Cette description est utilisée dans les journaux système et par systemctl pour identifier le service.

After=network.target : Cela garantit que le service démarre uniquement une fois le réseau disponible. Le network.target est une cible systemd qui indique que la fonctionnalité réseau de base est active.

Rubrique [Services]

Cette section spécifie la configuration du service lui-même, y compris son fonctionnement, quel utilisateur l'exécute et que faire en cas d'échec.

Utilisateur : Spécifie l'utilisateur sous lequel le service s'exécutera. Ici, il est défini sur root.

EnvironmentFile : Spécifie un fichier qui contient les variables d'environnement utilisées par le service.

WorkingDirectory : Spécifie le répertoire à partir duquel le service sera exécuté. Il s'agit du répertoire de travail du processus de service. Ici, les fichiers du bot sont stockés dans /root/selenium_bot/

ExecStart : Définit la commande pour démarrer le service. Ici, il exécute le fichier main.py dans /root/selenium_bot/

Restart=on-failure : configure le service pour qu'il redémarre automatiquement s'il se termine avec un échec (c'est-à-dire un statut de sortie différent de zéro). Ceci est utile pour garantir que le service du bot reste opérationnel, même en cas de pannes occasionnelles.

RestartSec=5s : Spécifie le délai entre les redémarrages en cas d'échec. Dans ce cas, le service attendra 5 secondes avant de tenter de redémarrer après un échec.

StandardOutput=journal : Redirige la sortie standard (stdout) du service vers le journal systemd, qui peut être consulté à l'aide de journalctl. Ceci est utile à des fins de journalisation et de débogage.

StandardError=journal : Redirige la sortie d'erreur standard (stderr) vers le journal systemd. Toutes les erreurs rencontrées par le service seront enregistrées et pourront également être consultées à l'aide de journalctl

Section [Installer]

Cette section définit comment et quand le service doit être activé ou démarré.

WantedBy=multi-user.target : Spécifie la cible sous laquelle le service doit être activé. Dans ce cas, multi-user.target est une cible systemd qui est atteinte lorsque le système est en mode multi-utilisateur non graphique (courant sur les serveurs). Cela signifie que le service sera démarré lorsque le système atteint cet objectif, généralement lorsque le système aura démarré dans un environnement multi-utilisateurs.

Pour en savoir plus sur tous les paramètres possibles pour un service systemd, consultez les références

Exécution du service

Vérifions que notre fichier de service est valide ; si tout va bien, rien ne devrait être affiché.

sudo apt update

Rechargez la configuration systemd, à la recherche d'unités (services) nouvelles ou modifiées.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Démarrez/Redémarrez votre service.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Arrêtez votre service.

google-chrome --version

Vérifiez l'état de votre service.

python3 -m venv venv

Faites ceci si vous souhaitez que votre service démarre automatiquement au démarrage.

source venv/bin/activate

Résolution des problèmes de mise en mémoire tampon des blocs

En Python, lorsque vous exécutez votre script dans un environnement interactif (par exemple, lorsque vous exécutez manuellement python3 filename.py dans un terminal), Python utilise la mise en mémoire tampon de ligne. Cela signifie que le résultat, comme celui d'une instruction print(), est affiché immédiatement.

Cependant, lorsque le programme Python est exécuté dans un environnement non interactif (c'est notre cas), la sortie utilisera la mise en mémoire tampon de blocs. Cela signifie que le programme conservera sa sortie dans un tampon jusqu'à ce que le tampon soit plein ou que le programme se termine, retardant ainsi le moment où vous pourrez voir les journaux/sorties.

Vous pouvez en savoir plus sur le fonctionnement de la mise en mémoire tampon de sortie de Python ici.

Puisque nous souhaitons afficher les journaux et les résultats en temps réel, nous pouvons résoudre ce problème de deux manières.

Utiliser l'indicateur -u

La documentation python3 nous le dit.

-u Force la suppression des flux stdout et stderr. Cette option n'a aucun effet sur le flux stdin

En utilisant l'indicateur -u, Python fonctionne dans un mode entièrement sans tampon pour stdout et stderr. Cela signifie que chaque octet est envoyé directement au terminal (ou à tout flux de sortie comme un fichier journal) dès qu'il est produit. Aucune mise en mémoire tampon n'a lieu.

Chaque caractère qui serait généralement envoyé vers la sortie standard (comme à partir d'instructions ou d'erreurs print()) est immédiatement écrit, octet par octet, sans attendre qu'une ligne complète ou un tampon ne s'accumule.

Pour utiliser cette option, exécutez votre script comme ceci :

sudo apt update

Si vous optez pour cette option, assurez-vous de modifier ExecStart dans le fichier de service.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Utilisation de l'argument Print Flush

En Python, la fonction print() met sa sortie en mémoire tampon par défaut, ce qui signifie qu'elle stocke la sortie en mémoire et ne l'écrit que lorsque le tampon est plein ou que le programme se termine. En utilisant flush=True, vous pouvez forcer Python à vider la sortie immédiatement après l'appel print(), garantissant ainsi que la sortie apparaît immédiatement.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Accéder aux journaux à l'aide de journalctl

Pour afficher l'historique complet des journaux de votre unité systemd (service), utilisez la commande suivante.

google-chrome --version

Pour surveiller les journaux en temps réel, utilisez l'indicateur -f. Cela affichera uniquement les entrées de journal les plus récentes et imprimera en continu les nouvelles entrées au fur et à mesure qu'elles sont ajoutées au journal.

python3 -m venv venv

Références

  • https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian
  • https://www.selenium.dev/documentation/webdriver/drivers/options/
  • https://www.lambdatest.com/blog/selenium-page-load-strategy/
  • https://pypi.org/project/webdriver-manager/
  • https://pypi.org/project/python-dotenv/
  • https://wiki.archlinux.org/title/Systemd
  • https://man.archlinux.org/man/systemctl.1
  • https://man.archlinux.org/man/systemd.service.5.en#EXEMPLES
  • https://man.archlinux.org/man/systemd-analyze.1
  • https://docs.python.org/3/using/cmdline.html#cmdoption-u
  • https://realpython.com/python-flush-print-output/
  • https://man.archlinux.org/man/journalctl.1

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn