質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Q&A

解決済

1回答

1430閲覧

プログラムのバックグラウンド稼働について

raspypy

総合スコア247

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

0グッド

0クリップ

投稿2020/09/18 06:07

編集2020/09/18 16:45

##やろうとしていること

MQTT Messageを常時受信するSubscribeプログラムを作成し、systemdで常時稼働させています。

##困っていること
次のプログラムは、MQTTの受信(Subscribe)プログラムです。
常時受信待ちの状況にするため、このプログラムをバックグラウンドで稼働させておきたいです。

具体的には、次のコマンドを実行していたいです。
nohup python test.py

##今起きている問題
systemdで自動起動させていましたが、自動起動のたびに、client.connectするため、
同じclient_idで続けて再接続してしまいます。(MQTTの通信が受信できないことがあります。)

そのため、自動起動ではなく、バックグラウンドで起動状態にしたいのですが、
どんな方法があるのでしょうか。

##プログラム

python

1#!/usr/bin/python 2# coding: utf-8 3import time 4from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient 5import subprocess 6 7CLIENT_ID = "hoge" 8ENDPOINT = "hogehoge.amazonaws.com" # <random>.iot.<region>.amazonaws.com 9PORT = 8883 10ROOT_CA = "/home/pi/dev/aws/rootCA.pem" 11PRIVATE_KEY = "/home/pi/dev/aws/hogehoge.pem.key" 12CERTIFICATE = "/home/pi/dev/aws/hogehoge.pem.crt" 13 14#大文字・小文字の区別に注意 15#Publishで設定しているTopicと同じに設定 16TOPIC = "test" 17 18def main(): 19 # setting for MQTT 20 client = AWSIoTMQTTClient(CLIENT_ID) 21 client.configureEndpoint(ENDPOINT, PORT) 22 client.configureCredentials(ROOT_CA, PRIVATE_KEY, CERTIFICATE) 23 # AWSIoTMQTTClient connection configuration 24 client.configureAutoReconnectBackoffTime(1, 32, 20) 25 # -1:infinite 26 client.configureOfflinePublishQueueing(-1) 27 # Draining: 2 Hz 28 client.configureDrainingFrequency(2) 29 # 10 sec 30 client.configureConnectDisconnectTimeout(10) 31 # 5 sec 32 client.configureMQTTOperationTimeout(5) 33 # Connect to AWS IoT with default keepalive set to 600 seconds 34 # keepAliveIntervalSecond : Time in seconds for interval of sending MQTT ping request. Default set to 600 seconds. 35 client.connect() 36 # TOPICが起動したら呼ばれる関数を登録するQoS(Quality of Service)=1 37 # QoS=0:投げっぱなし,QoS=1:少なくとも1回は確実にBrokerにメッセージが届く 38 client.subscribe(TOPIC, 1, mycallback) 39# time.sleep(5) 40 #無限ループ 41 while True: 42 time.sleep(5) 43 44def mycallback(client, userdata, message): 45 print("Received message '" + str(message.payload) + "' on topic '" + message.topic + "' with QoS " + str(message.qos)) 46 if message.payload == "red": 47 print("red") 48 subprocess.check_call(['python','/home/pi/dev/RED.py']) 49 elif message.payload == "blue": 50 print("blue") 51 subprocess.check_call(['python','/home/pi/dev/BLUE.py']) 52 elif message.payload == "yellow": 53 print("yellow") 54 subprocess.check_call(['python','/home/pi/dev/YELLOW.py']) 55 elif message.payload == "green": 56 print("green") 57 subprocess.check_call(['python','/home/pi/dev/GREEN.py']) 58 else: 59 print("RYGB") 60 subprocess.check_call(['python','/home/pi/dev/RYGB.py']) 61 62 63if __name__ == "__main__": 64 main() 65

##Unitファイル

text

1[Unit] 2Description=Subscriber 3Wants=network.target 4 5[Service] 6WorkingDirectory=/home/pi/dev/plc 7ExecStart=/home/pi/dev/test.py 8Restart=on-failure 9RestartSec=5s 10User=pi 11Group=pi 12 13[Install] 14WantedBy=multi-user.target

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2020/09/18 06:18

systemdによって起動された状態で systemctl status で起動状態を見ると何かメッセージが出ていたりしませんか? 遅れていても受信はできているということは起動できていないということはない気はするのですが…。
raspypy

2020/09/18 06:28

起動状態は"active (running)"です。 おっしゃるとおり、起動できていないということはないのですが、受信が遅れてしまいます。 プログラムを実行した状態では、受信が遅れることがないので、原因が分からず困っております。
yu_1985

2020/09/18 06:34

起動状態そのものだけを見るのではなく、一緒に出ている起動時のメッセージになにか出ていないかも見てみてください。 また、切り分けのために、pythonを直接実行するのではなくシェルスクリプトを経由して該当のプログラムを実行させるようにしてみてください。 https://qiita.com/tkato/items/6a227e7c2c2bde19521c#opt%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%90%8Dbinyyyysh%E3%81%AE%E4%B8%AD%E8%BA%AB そのプログラム自身が何かしらログを出していたらそれを見たいところですが…。
raspypy

2020/09/18 06:44

journalctl -u ユニットファイル名で出力ログを確認しましたが、 ログは、MQTT受信したときの時刻となります。(送信時刻ではなく)
yu_1985

2020/09/18 06:55

断片的な情報過ぎてそもそもログに何が出ているのかわからないので、どの出力を見て何を確認したのかがわかるようにできればそのまま貼ったほうが良いかと。 それが何のログかも明確ではないですし。 感覚的には、受信側のプログラムを動かしているので受信時刻になるのは別段おかしくないのでは、と思うのですが、そもそも見るべきなのがそこなのかわかりません。
guest

回答1

0

自己解決

systemd oneshotで実現できました。

投稿2020/09/19 11:52

raspypy

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問