web-dev-qa-db-ja.com

起動時にコマンドが実行されない(コードの実行時にネットワークが起動していなかったため)

Ubuntuの起動時にpythonスクリプトを自動的に実行したい。通常、私がしなければならないことは、ubuntuでコマンドラインを開いて入力することです

python /home/ubuntu/Desktop/UDP_Server.py

これによりpythonコードが実行されるので、他のクライアントコードを起動して通信できるようになります。

起動時にこのコードを自動的に実行する方法を見つけたいです。 /etc/init.dファイルにスクリプトを入れてみましたが、以下に示すように、起動プログラムとしても使用しようとしました。

Startup Application

しかし、コンピューターの電源を入れてもこのコードは実行されません..期待どおりにクライアントコードと通信していないためです(コマンドラインからpythonスクリプトを実行するときのように) )

編集:

rc.localのtouchコマンドなどのコマンドを入力すると、起動時に動作するようです。また、crontabにも同じことが言えます。コマンド@rebootを追加して動作します。しかし、この特定のコードは、スタートアップ(crontab、rc.local、init.dに置くか、スタートアップアプリケーションとして置くか)

以下は私の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)

コマンドラインでこれを実行すると、次のように動作します

starting up on 192.168.1.13 port 10000
Serial connected

その後、プログラムは接続を待ちます。 UDPクライアントにSTOPを送信させる場合

received 'STOP'

その後、コンピューターはシャットダウンします。

しかし、起動時にコードが実行され、UDPクライアントを介して「STOP」を送信しても、コンピューターはシャットダウンしません。 sock.recvを使用したサーバーコードのwhileループは、送信されている文字列を受信して​​いません。

解決:

/ etc/network/interfacesファイルに次のコード行を追加した後

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

起動時に実行されたコードは、wifiネットワークが機能した後で、クライアントはサーバーと通信できました。

5
blembo

ネットワークインターフェイスが起動した後、コマンドを実行する必要があります。この回答で説明されているように: https://unix.stackexchange.com/a/91264

1

起動時に何かを実行する最も簡単な方法は、cronで@rebootを使用することです。

これは、ユーザーのcrontabで実行できます。多くの場合、root権限で開始するinitで実行するよりも便利です。

詳細については、crontab(5)の manpage を参照してください。

それはすべての使用に理想的ではありませんが、多くの場合、優れたメカニズムであり、非常に簡単です。

4
ssta

スクリプトをrc.localに追加する必要があると思います。すべてのスクリプトはルートとして実行されます。

編集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

ナノプレスで保存して終了するには Ctrl+X

4
Neil