Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation

Jusqu'à récemment, les programmes slackbot écrits en Python étaient transformés en démons avec python-daemon, mais la gestion était gênante car les programmes n'étaient pas exécutés automatiquement au démarrage du système d'exploitation. Lorsque j'ai essayé d'utiliser systemd au lieu de python-daemon, j'ai pu exécuter le programme automatiquement au démarrage du système d'exploitation, je vais donc vous montrer comment le faire.

Environnement d'exécution

Windows 10 Home Python 3.7.3 Raspberry Pi OS 10

1. Exemple de programme pour exécuter slackbot

run.py


import time

from slackbot.bot import Bot
from slacker import Slacker

def main():
    bot = Bot()
    bot.run()

slack = Slacker('Entrez le jeton API')
channel_name = 'Saisissez le nom de la chaîne sur laquelle vous souhaitez publier un message'
message = 'Entrez le contenu du message'

if __name__ =="__main__":
    slack.chat.post_message(channel_name, message, as_user=True) #Publier un message au démarrage
    time.sleep(3) # 'Start request repeated too quickly.'Mesures pour
    main() #Lancer slackbot

slackbot_settings.py


API_TOKEN = 'Entrez le jeton API'
DEFAULT_REPLY = 'Entrez le message renvoyé par Bot lorsque vous ne comprenez pas la signification du message adressé à Bot'

PLUGINS = ['run.py, slackbot_settings.Nom de programme utilisé autre que py
           (Exemple: slackbot_module)écrire']

slackbot_module.py


import random
import re

from slackbot.bot import listen_to

morning_greetings = ['Bonjour!', 'Nem ...(˘ω˘)']
@listen_to(r'^(Bonjour|Bonjour ~|Bonjour)(Il y a.*)?$')
def morning_greeting(message, fir_word, sec_word):
    message.reply(random.choice(morning_greetings))
    message.react('Entrez le nom anglais du pictogramme')

afternoon_greetings = ['salut!', 'Bonjour']
@listen_to(r'^Bonjour.*$')
def afternoon_greeting(message):
    message.reply(random.choice(afternoon_greetings))
    message.react('Entrez le nom anglais du pictogramme')

night_greetings = ['Bonsoir!', 'Bonsoir']
@listen_to(r'^Bonsoir.*$')
def night_greeting(message):
    message.reply(random.choice(night_greetings))
    message.react('Entrez le nom anglais du pictogramme)')

point important

Assurez-vous de nommer le fichier qui décrit API_TOKEN slackbot_settings.py: 3 Assurez-vous d'écrire time.sleep (3) dans run.py ...! La raison sera expliquée plus tard.

2. Transfert de fichiers

Transférez le fichier créé localement sur le Raspberry Pi. Par mesure de sécurité, configurons l'authentification par clé publique. Après avoir terminé les paramètres, démarrez l'invite de commande ou PowerShell et

scp chemin du fichier à copier-i Chemin du fichier de clé privée-p numéro de port nom d'utilisateur@nom d'hôte:Nom du répertoire pour mettre le fichier

Transférez le fichier avec.

3. Connexion SSH

SSH au Raspberry Pi à partir de la ligne de commande.

ssh -i Chemin du fichier de clé privée-p numéro de port nom d'utilisateur@nom d'hôte

Vous pouvez rapidement vous connecter à la télécommande en créant un fichier de configuration appelé config directement sous ~ / .ssh /.

Exemple d'entrée


Host raspi
    User hoge
    HostName raspberrypi
    Port 2222
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes

Dans cet exemple

ssh -i ~/.shh/id_rsa -p 2222 hoge@raspberry

Autres,

ssh raspi

Vous pouvez également établir une connexion SSH avec cette commande.

4. paramètres systemd

Créez un fichier de service sous / etc / systemd / system /. Cette fois, je veux faire de run.py un démon, donc je vais créer un fichier appelé rund.service (peu importe si le nom du fichier est approprié).

$ sudo nano /etc/systemd/system/rund.service

Écrivez les paramètres suivants dans rund.service.

rund.service


[Unit]
Description = slackbot daemon

[Service]
Type = simple
Restart = on-failure
ExecStart =Chemin absolu vers l'exécution de Python3.Chemin absolu vers py

[Install]
WantedBy = multi-user.target

Puisque l'écriture est terminée, je vais démarrer systemd.

$ sudo systemctl start rund

N'oubliez pas de vérifier si cela fonctionne! Vérifions l'état avec la commande suivante.

$ sudo systemctl status rund

Si ʻActive: active (running) `s'affiche, c'est OK.

Configurez le programme run.py, qui a été démonisé plus tôt, pour qu'il s'exécute automatiquement au démarrage du système d'exploitation.

$ sudo systemctl enable rund

5. Confirmation du démarrage automatique

Au cas où, assurez-vous qu'il peut être démarré automatiquement.

$ sudo reboot

Après la reconnexion, vérifiez à nouveau l'état avec la commande suivante.

$ sudo systemctl status rund

Comme précédemment, si ʻActive: active (running) `est affiché, le réglage est terminé! !!

Si le démarrage automatique échoue et dit "Demande de démarrage répétée trop rapidement".

スクリーンショット 2020-08-16 160625.png

Comme la connexion Internet n'est pas établie immédiatement après le démarrage du système d'exploitation, il semble que slackbot ne démarre pas même si run.py est exécuté à ce moment (dans mon environnement, ʻAfter = network.target dans le fichier de service). Cela n'a pas fonctionné même si j'ai ajouté `). S'il ne démarre pas, rund.service exécutera à nouveau run.py. Cependant, comme il n'y a pas de connexion Internet, il ne redémarre pas ... et ainsi de suite. Après enquête, il semble que le démarrage automatique soit réglé pour s'arrêter si le temps total pour démarrer run.py pour la 6ème fois est dans les 10 secondes après l'échec du démarrage automatique répété 5 fois. Pour contourner le problème, écrivez time.sleep () dans la ligne avant main () afin qu'il ne démarre pas automatiquement 6 fois dans les 10 secondes.


réduction

if __name__ =="__main__":
    time.sleep(3)
    main()

Si vous l'écrivez ainsi, il démarrera automatiquement.

Recommended Posts

Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation
Écrivons un programme Python et exécutons-le
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Associez Python Enum à une fonction pour la rendre appelable
Récupérez la chaîne correspondante dans l'expression régulière et réutilisez-la lors du remplacement sur Python3
[Python] Faire de la fonction une fonction lambda
Lors de l'écriture d'un programme en Python
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Lorsque l'aimant est rapproché, le moteur se déplace et s'arrête automatiquement)
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
J'ai essayé de créer un système pour acquérir automatiquement le guide des programmes → l'enregistrer dans le calendrier en un jour
Exécuter l'interpréteur Python dans le script
[Mémo personnel] Obtenez des données sur le Web et faites-en un DataFrame
Un programme python qui redimensionne une vidéo et la transforme en image
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
[Python] Un programme qui arrondit le score
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
[Python] Précautions lors de l'acquisition de données en grattant et en les mettant dans la liste
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Utilisez python sur Raspberry Pi 3 pour éclairer la LED quand il fait noir!
Exécutez régulièrement des programmes Python sur AWS Lambda
ffmpeg-Construisez un environnement python et divisez la vidéo
Copiez la liste en Python
Prise en compte des forces et faiblesses de Python
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
[CGI] Exécutez le programme Python du serveur avec Vue.js + axios et obtenez les données de sortie
[Selenium] Ouvrez le lien dans un nouvel onglet et déplacez-le [Pilote Python / Chrome]
Il y a un modèle que le programme ne s'est pas arrêté lors de l'utilisation du thread Python
Jusqu'à ce que vous puissiez installer Blender et l'exécuter avec python pour le moment
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
[Python] Un programme qui compte le nombre de vallées
Spécifiez le volume sous Linux et jouez le son
Faisons un Makefile et construisons-le (super débutant)
Essayez de créer un jeu simple avec Python 3 et iPhone
Faire un point d'arrêt sur la couche c avec python
python Spécifie la fonction à exécuter lorsque le programme se termine
[Python] Assurez-vous que la fonction reçue est une fonction définie par l'utilisateur
[Python] Un programme qui compare les positions des kangourous.
Lors de l'accès à une URL contenant du japonais (URL japonais) avec python3 avec urllib, elle sera encodée arbitrairement avec html et une erreur se produira, alors notez la solution de contournement
Exécutez le programme sans créer d'environnement Python! !! (Comment démarrer avec Google Colaboratory)
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python
Un programme qui redimensionne automatiquement la taille d'image requise pour les icônes d'application iOS en Python
Comment démarrer le PC à une heure fixe chaque matin et exécuter le programme python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Extraire uniquement le son d'un instrument spécifique du fichier MIDI et en faire un fichier séparé
Analysez l'API Researchmap avec Python et créez automatiquement un fichier Word pour la liste des succès
[Python débutant] Variables et portée à l'intérieur de la fonction (lorsque le traitement à l'intérieur de la fonction est reflété à l'extérieur de la fonction et quand il n'est pas reflété)
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Précautions lors de la saisie à partir de CSV avec Python et de la sortie vers json pour faire exe
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
Remarque: lorsque Python est exécuté sur ImageJ Fiji, java.lang.IllegalArgumentException apparaît et sa solution (mac OS)
Essayez de le faire avec GUI, PyQt en Python
Comment exécuter un programme Python à partir d'un script shell
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]