A execução de um comando na inicialização não está funcionando (devido à rede não estar ativa quando o código foi executado)

5

Eu quero executar um script python automaticamente quando o Ubuntu for iniciado. Normalmente o que tenho que fazer é abrir a linha de comando no Ubuntu e digitar

python /home/ubuntu/Desktop/UDP_Server.py

Isso executará o código python para que eu possa agora iniciar meu outro código de cliente para se comunicar com ele.

Eu quero encontrar uma maneira de executar esse código automaticamente na inicialização. Eu tentei colocar um script no meu arquivo /etc/init.d e também tentei tê-lo como um programa de inicialização como mostrado abaixo.

Mas quando eu ligo meu computador neste código, ele não roda ... porque ele não está se comunicando com o código do meu cliente como eu esperava (como acontece quando eu executo o script python pela linha de comando)

EDITAR:

Colocar comandos como um comando touch em rc.local parece funcionar na inicialização. O mesmo vale para o crontab. Eu adicionei um comando @reboot e ele funciona. Mas este código em particular não parece funcionar na inicialização (quer eu coloque em crontab, rc.local, init.d ou como um aplicativo de inicialização)

Abaixo está o meu código do servidor 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)

Quando eu executo isso na linha de comando, funciona algo assim

starting up on 192.168.1.13 port 10000
Serial connected

Então o programa espera por uma conexão. Se eu tenho o meu cliente UDP enviar STOP

received 'STOP'

O computador então é desligado.

Mas quando o código é executado na inicialização e eu envio 'STOP' por meio do UDP Client, o computador não desliga. O loop while no código do servidor com o sock.recv de alguma forma não está recebendo as strings que estão sendo enviadas para ele.

SOLUÇÃO:

Depois de adicionar as seguintes linhas de código ao meu arquivo / etc / network / interfaces

auto wlan0
    iface wlan0 inet dhcp
    post-up python /home/ubuntu/Desktop/UDP_Server.py

O código executado na inicialização depois que a rede wifi estava funcionando para que meu cliente pudesse se comunicar com o servidor.

    
por blembo 22.10.2015 / 00:47

3 respostas

1

Você precisa executar o comando depois que as interfaces de rede forem ativadas. Conforme descrito nesta resposta: link

    
por Yurii Kolesnykov 23.10.2015 / 18:11
4

Muitas vezes, acho que a maneira mais fácil de executar algo na inicialização é via cron com @reboot.

Isso pode viver em seu crontab de usuário, que geralmente é melhor do que executá-lo via init, onde ele começa com privilégios de root.

Veja a página de manual para o crontab (5) para detalhes.

Não é ideal para todos os usos, mas geralmente é um bom mecanismo e é MUITO fácil de fazer.

    
por ssta 23.10.2015 / 00:22
4

Eu acho que você precisa adicionar seu script em rc.local todos os scripts executados como root.

Edite o 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

Para salvar e sair com nano press Ctrl + X .

    
por Neil 22.10.2015 / 03:38