Je veux exécuter un script python automatiquement au démarrage d'ubuntu. Normalement, je dois ouvrir la ligne de commande sur Ubuntu et taper
python /home/ubuntu/Desktop/UDP_Server.py
Cela va exécuter le code python afin que je puisse maintenant démarrer mon autre code client pour communiquer avec lui.
Je veux trouver un moyen d'exécuter ce code automatiquement au démarrage. J'ai essayé de mettre un script dans mon fichier /etc/init.d
et j'ai également essayé de l'avoir comme programme de démarrage, comme indiqué ci-dessous.
Mais lorsque je mets mon ordinateur sous tension, ce code ne s'exécute pas… car il ne communique pas avec le code de mon client comme je le prévois (comme c'est le cas lorsque j'exécute le script python à partir de la ligne de commande )
MODIFIER:
Le fait de placer des commandes telles qu'une commande tactile dans rc.local semble fonctionner au démarrage. Il en va de même pour crontab. J'ai ajouté une commande @reboot et cela fonctionne. Mais ce code particulier ne semble pas fonctionner à démarrage (que je le mette dans crontab, rc.local, init.d ou en tant qu’application de démarrage)
Ci-dessous, le code de mon serveur UDP
import socket
import serial
import subprocess
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = (192.168.1.13, 10000)
print 'starting up on %s port %s' % server_address
sock.bind(server_address)
ser = serial.Serial('/dev/ttymxc3', 115200, timeout = 0)
print 'Serial connected'
while True:
data = sock.recv(7)
print 'received ', data
if data == "STOP":
subprocess.call(["Sudo", "shutdown", "-h", "now"])
else:
ser.write(data)
Quand je lance ceci en ligne de commande, cela fonctionne comme ceci
starting up on 192.168.1.13 port 10000
Serial connected
Ensuite, le programme attend une connexion. Si j'ai mon client UDP, envoyez STOP
received 'STOP'
L'ordinateur s'arrête alors.
Mais lorsque le code est lancé au démarrage et que j'envoie "STOP" via le client UDP, l'ordinateur ne s'éteint pas. La boucle while dans le code serveur avec sock.recv ne reçoit pas les chaînes qui lui sont envoyées.
SOLUTION:
Après avoir ajouté les lignes de code suivantes à mon fichier/etc/network/interfaces
auto wlan0
iface wlan0 inet dhcp
post-up python /home/ubuntu/Desktop/UDP_Server.py
Le code exécuté au démarrage après le fonctionnement du réseau wifi afin que mon client puisse communiquer avec le serveur.
Vous devez exécuter votre commande après que les interfaces réseau se soient levées. Comme décrit dans cette réponse: https://unix.stackexchange.com/a/91264
Je trouve souvent que le moyen le plus simple d'exécuter quelque chose au démarrage consiste à utiliser cron avec @reboot.
Cela peut vivre dans votre crontab utilisateur, ce qui est souvent plus agréable que de l'exécuter via init où il commence avec les privilèges root.
Voir la page de manuel pour crontab (5) pour plus de détails.
Ce n'est pas idéal pour chaque utilisation, mais c'est souvent un bon mécanisme et c'est TRÈS facile à faire.
Je pense que vous devez ajouter votre script dans rc.local
tous les scripts sont exécutés en tant que root.
Éditer rc.local
:
Sudo nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
python /home/ubuntu/Desktop/UDP_Server.py
exit 0
Pour enregistrer et quitter avec nano, appuyez sur Ctrl+X.