5 votes

L'exécution d'une commande au démarrage ne fonctionne pas (en raison du fait que le réseau n'était pas opérationnel au moment de l'exécution du code).

Je veux lancer un script Python automatiquement au démarrage d'ubuntu. Normalement, ce que je dois faire, c'est ouvrir la ligne de commande sur ubuntu et taper

python /home/ubuntu/Desktop/UDP_Server.py

Cela va exécuter le code Python et je peux maintenant lancer mon autre code client pour communiquer avec lui.

Je veux trouver un moyen de faire exécuter ce code automatiquement au démarrage. J'ai essayé de mettre un script dans mon /etc/init.d et j'ai également essayé de l'avoir comme programme de démarrage comme indiqué ci-dessous.

Startup Application

Mais lorsque j'allume mon ordinateur, ce code ne s'exécute pas parce qu'il ne communique pas avec mon code client comme je l'attends (comme il le fait lorsque j'exécute le script Python script depuis la ligne de commande).

EDITAR:

Placer des commandes telles qu'une commande touch dans rc.local semble fonctionner au démarrage. C'est également le cas pour la crontab. J'ai ajouté une commande @reboot et cela fonctionne. Mais ce code particulier ne semble pas fonctionner au démarrage (que je le place dans crontab, rc.local, init.d ou comme application de démarrage).

Voici 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)

Lorsque je l'exécute en ligne de commande, cela donne quelque chose comme ceci

starting up on 192.168.1.13 port 10000
Serial connected

Ensuite, le programme attend une connexion. Si je demande à mon client UDP d'envoyer STOP

received 'STOP'

L'ordinateur s'éteint alors.

Mais lorsque le code est exécuté au démarrage et que j'envoie 'STOP' via le client UDP, l'ordinateur ne s'arrête pas. La boucle while du 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 que le réseau wifi ait fonctionné donc mon client a pu communiquer avec le serveur.

4voto

demonplus Points 3998

Je pense que vous devez ajouter votre script en rc.local tous les scripts sont exécutés en tant que root.

Editar 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 sauvegarder et quitter avec nano, appuyez sur Ctrl + X .

4voto

ssta Points 663

Je trouve souvent que la façon la plus simple de lancer quelque chose au démarrage est via cron avec @reboot.

Cela peut être placé dans la crontab de votre utilisateur, ce qui est souvent plus agréable que de le lancer via init où il démarre avec les privilèges de root.

Ver la page de manuel pour crontab(5) pour plus de détails.

Ce n'est pas idéal pour tous les usages, mais c'est souvent un bon mécanisme et c'est TRÈS facile à faire.

1voto

Yurii Kolesnykov Points 1219

Vous devez exécuter votre commande après que les interfaces réseau aient été mises en place. Comme décrit dans cette réponse : https://unix.stackexchange.com/a/91264

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X