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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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負荷・電力消費量などを抑えることができます。

解決済

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

raspypy
raspypy

総合スコア236

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負荷・電力消費量などを抑えることができます。

1回答

0リアクション

0クリップ

581閲覧

投稿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

#!/usr/bin/python # coding: utf-8 import time from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient import subprocess CLIENT_ID = "hoge" ENDPOINT = "hogehoge.amazonaws.com" # <random>.iot.<region>.amazonaws.com PORT = 8883 ROOT_CA = "/home/pi/dev/aws/rootCA.pem" PRIVATE_KEY = "/home/pi/dev/aws/hogehoge.pem.key" CERTIFICATE = "/home/pi/dev/aws/hogehoge.pem.crt" #大文字・小文字の区別に注意 #Publishで設定しているTopicと同じに設定 TOPIC = "test" def main(): # setting for MQTT client = AWSIoTMQTTClient(CLIENT_ID) client.configureEndpoint(ENDPOINT, PORT) client.configureCredentials(ROOT_CA, PRIVATE_KEY, CERTIFICATE) # AWSIoTMQTTClient connection configuration client.configureAutoReconnectBackoffTime(1, 32, 20) # -1:infinite client.configureOfflinePublishQueueing(-1) # Draining: 2 Hz client.configureDrainingFrequency(2) # 10 sec client.configureConnectDisconnectTimeout(10) # 5 sec client.configureMQTTOperationTimeout(5) # Connect to AWS IoT with default keepalive set to 600 seconds # keepAliveIntervalSecond : Time in seconds for interval of sending MQTT ping request. Default set to 600 seconds. client.connect() # TOPICが起動したら呼ばれる関数を登録するQoS(Quality of Service)=1 # QoS=0:投げっぱなし,QoS=1:少なくとも1回は確実にBrokerにメッセージが届く client.subscribe(TOPIC, 1, mycallback) # time.sleep(5) #無限ループ while True: time.sleep(5) def mycallback(client, userdata, message): print("Received message '" + str(message.payload) + "' on topic '" + message.topic + "' with QoS " + str(message.qos)) if message.payload == "red": print("red") subprocess.check_call(['python','/home/pi/dev/RED.py']) elif message.payload == "blue": print("blue") subprocess.check_call(['python','/home/pi/dev/BLUE.py']) elif message.payload == "yellow": print("yellow") subprocess.check_call(['python','/home/pi/dev/YELLOW.py']) elif message.payload == "green": print("green") subprocess.check_call(['python','/home/pi/dev/GREEN.py']) else: print("RYGB") subprocess.check_call(['python','/home/pi/dev/RYGB.py']) if __name__ == "__main__": main()

##Unitファイル

text

[Unit] Description=Subscriber Wants=network.target [Service] WorkingDirectory=/home/pi/dev/plc ExecStart=/home/pi/dev/test.py Restart=on-failure RestartSec=5s User=pi Group=pi [Install] WantedBy=multi-user.target

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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負荷・電力消費量などを抑えることができます。