web-dev-qa-db-fra.com

L'exécution d'une commande au démarrage ne fonctionne pas (en raison du manque de réseau lors de l'exécution du code)

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.

Startup Application

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.

5
blembo

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

1
Yurii Kolesnykov

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.

4
ssta

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.

4
Neil