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.
Windows 10 Home Python 3.7.3 Raspberry Pi OS 10
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)')
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.
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.
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.
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
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é! !!
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.