PLCNEXT#podman MQTT Brokerを自動的に起動する

この記事ではPLCNEXT AXCF 2152(Firmware2023.0)を電源入れるときに自動的にmosquittoのMQTT Brokerを起動する手順を説明します。よろしくおねがいします。

Before Start..

最初はpodmanの公式ドキュメントを沿って構築しようと思いますが‥

https://podman.io/blogs/2018/09/13/systemd.html

sudo systemctl enable redis.service
sudo systemctl start redis.service

systemctrlコマンドがないとPLCNEXTに怒られました。

root@axcf2152:/opt/plcnext/# systemctl
sh: systemctl: command not found

Martrin さんがsystemctrlはPLCNEXTがSupportしませんと言いました。

https://www.plcnext-community.net/forum/#/discussion/1184/controlling-the-openvpn-service

Reference Link

PLCNEXT#AXCF 2152にdocker,podmanを試してみよう
PLCNEXT#Node-redでNodeインストールエラーのトラブル対処法
PLCNEXT#podmanでImagesを作成しよう
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part6
PLCNEXT#Play with InfluxDB x telegraf
PLCNEXT#Play with Influxdb

Start From Example

でも方法はまだいくらでもあります。今回はinit.dのFileを修正し、podmanを自動起動できるようにします。

こちらのLinkからExampleをDownloadできます。

https://github.com/plcnextusa/init.d_Example

Be careful!

操作は注意深く。誤ったFileやFolderを削除してしまったらPLCNEXtが起動できなくなります。

Clone the Example

先程のLinkからFileをDownload>解凍し、WinSCPなどのSFTP Software経由でPLCNEXTにFileをすべて転送します。

git clone https://github.com/plcnextusa/init.d_Example.git

Installation

転送先は/opt/plcnext/です。

Login as Root

SSH Clientでroot loginしてください。

Change the permission

DownloadされたFileがすべて実行できるように権限を編集します。

root@axcf2152:chmod +x install.sh python.sh helloworld.py

Execute the Shell Script

install.shを実行すればOKです。

root@axcf2152:./install.sh

Check the Log Files

ExampleではPython ScirptがCPU立ち上げたときに自動的に実行し10秒一回でhello.logにテキストを書き込むプログラムです。

root@axcf2152:/opt/plcnext/# ls logs/
Output.log default.sqlite  plcnextapp.log   uatrace.log uatrace_2.log uatrace_4.log  watchdogDaemon
Output.log.lock  hello.log security.sqlite  uatrace_1.log  uatrace_3.log uatrace_5.log

hello.logを開いて確認してみましょう。

root@axcf2152:cat  /opt/plcnext/logs/hello.log 
root@axcf2152:/opt/plcnext/# cat logs/hello.log
[2023-04-18T21:49:22] INFO [root.<module>:16] Hello from init.d!
[2023-04-18T21:49:32] INFO [root.<module>:16] Hello from init.d!
[2023-04-18T21:49:42] INFO [root.<module>:16] Hello from init.d!
[2023-04-18T21:49:52] INFO [root.<module>:16] Hello from init.d!
[2023-04-18T21:50:02] INFO [root.<module>:16] Hello from init.d!

Auto Start Mqtt Podman

基本動作が確認されたら次はMQTT Brokerを自動に起動できるように設定します。

Broker images

まずはBroker Containerを構築します。

structure

Folderの構造です。

├── docker-compose.yml
├── mosquitto
    └── config
        └── mosquitto.conf

docker-compose.yml

Docker fileの中身です。

version: “3”
services:
  mqtt:
      image: eclipse-mosquitto
      container_name: mqtt
      expose:
        – 1883
      ports:
        – 1883:1883
      restart: unless-stopped
      volumes:
        – ./mosquitto/config:/mosquitto/config

mosquitto.conf

MQTT Brokerの設定Fileになります。

set_tcp_nodelay true
listener 1883
allow_anonymous true
max_queued_messages 0

change rights

ContainerをBuildする前にすべてのFileを実行できるように権限を編集します。

chmod +x

build

ContainerをBuildします。

docker-compose up

startup.sh

Shell ScriptにMQTT Containerを起動するコマンドなどが入っています。

#!/bin/sh
echo “Hello start” >> /opt/plcnext/log.txtpodman network create podmanpodman start mqttpodman start mqttpodman start mqttpodman start mynoderedecho “end…” >> /opt/plcnext/log.txt

Update the python.sh

python.shを編集します。

DAEMON=$DIR/startup.shを変更し実行するFileをstarup.shます。

DAEMON_USER=rootを変更し実行するUserをrootにします。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/opt/plcnext
DAEMON=$DIR/startup.sh
DAEMON_NAME=hello2

# Change the uuser that runs the script if accessing files. Otherwise keep as admin.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

do_start () {
    # Starts the daemon (our python script) in the background with the configured DAEMON_USER
    start-stop-daemon –start –background –pidfile $PIDFILE –make-pidfile –user $DAEMON_USER –chuid $DAEMON_USER –startas $DAEMON — $DAEMON_OPTS
}
do_stop () {
    # Starts the daemon (our python script) based to the process id, after 10 retries it just kills the process
    start-stop-daemon –stop –pidfile $PIDFILE –retry 10
}

#keys to call the script, e.g. ./pystart.sh start
case “$1” in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    *)
        echo “Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart}”
        exit 1
        ;;

esac
exit 0

Updating your init.d service 

将来にまたScriptなどを変更した場合、もしCPUを再起動したくないなら、以下のコマンドでServicesだけを再起動することも可能です。

/etc/init.d/python.sh restart

Check MQTT Docker

Done!再起動したらMQTT Brokerが自動的に起動しました。

root@axcf2152:/opt/plcnext/# podman ps
CONTAINER ID  IMAGE                                       COMMAND               CREATED       STATUS             PORTS                   NAMES
34fa7e1faf20  docker.io/library/eclipse-mosquitto:latest  /usr/sbin/mosquit…  17 hours ago  Up 18 minutes ago  0.0.0.0:1883->1883/tcp  mqtt

Uninstalling the example

先程インストールしたExample Fileを削除するには以下のコマンドを実行してください。

update-rc.d –f python.sh remove
rm -r python.sh

Be careful!

注意するのはPLCNEXTの init.d にあるServicesを削除する前、その削除先を確認してください。必要なServiceを削除した場合PLCNEXTは起動できなくなります。

What is inide the ?

最後にInstall.shの中身を少し説明します。

Install.sh

#!/bin/bash

echo “Starting install process…. Please wait…”

echo “Changing permissions for execution”
chmod +x /opt/plcnext/helloworld.py
chmod +x /opt/plcnext/python.sh

echo “Setting up init.d”
cpa /opt/plcnext/python.sh /etc/init.d/
cd /etc/init.d/
update-rc.d python.sh defaults
./python.sh start
rm -r /opt/plcnext/python.sh

echo “Removing residual files”
cd /opt/plcnext/
rm -r README.md
rm -r install.sh

echo “Log file for errors is hello.log in the /opt/plcnext/logs folder.”
echo “Install complete!”

“#!/bin/bash” は、シェルスクリプトの最初の行に書かれる特別なコメントで、シェルがどのプログラムを使ってスクリプトを実行するべきかを示すために使用されます。この場合、Bashシェルを使用してスクリプトを実行するように指示しています。

#!/bin/bash

Fileの実行権限を実行できるように修正します。

chmod +x /opt/plcnext/helloworld.py
chmod +x /opt/plcnext/python.sh

Fileを/etc/init.d/に移動し、作業Directoyを/etc/init.d/に変わります。

cpa /opt/plcnext/python.sh /etc/init.d/
cd /etc/init.d/

“update-rc.d”は、DebianやUbuntuなどのLinuxディストリビューションで使用されるinitスクリプトの管理ツールです。initスクリプトは、Linuxシステムが起動するときに自動的に実行されるプログラムであり、各ランレベルに対して実行される特定のサービスを開始または停止するために使用されます。

“update-rc.d”は、initスクリプトを管理するためのコマンドラインユーティリティで、スクリプトの有効化、無効化、削除などのタスクを実行することができます。

以下のExampleは、python.shのinitスクリプトをランレベルに登録し、システムが起動するときに自動的にpython.shを開始するためのシンボリックリンクを作成します。

update-rc.d python.sh defaults
./python.sh start
rm -r /opt/plcnext/python.sh

最後は作業Directoryを/opt/plcnext/に戻り、不要なFileを削除する。

cd /opt/plcnext/
rm -r README.md
rm -r install.sh

python.sh

次はpython.shです。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/opt/plcnext
DAEMON=$DIR/helloworld.py
DAEMON_NAME=hello

# Change the uuser that runs the script if accessing files. Otherwise keep as admin.
DAEMON_USER=admin

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

do_start () {
    # Starts the daemon (our python script) in the background with the configured DAEMON_USER
    start-stop-daemon –start –background –pidfile $PIDFILE –make-pidfile –user $DAEMON_USER –chuid $DAEMON_USER –startas $DAEMON — $DAEMON_OPTS
}
do_stop () {
    # Starts the daemon (our python script) based to the process id, after 10 retries it just kills the process
    start-stop-daemon –stop –pidfile $PIDFILE –retry 10
}

#keys to call the script, e.g. ./pystart.sh start
case “$1” in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    *)
        echo “Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart}”
        exit 1
        ;;

esac
exit 0

実行するUserを設定します。

DAEMON_USER=admin

PIDFILEを設定します。

PIDFILE=/var/run/$DAEMON_NAME.pid

“start-stop-daemon”は、Unix系オペレーティングシステムでデーモンプロセスを起動、停止、再起動するためのツールです。デーモンプロセスは、バックグラウンドで実行される常駐型のプロセスであり、システムの管理やサービス提供などの様々なタスクを担当します。

  • –start: デーモンプロセスを開始することを指定します。
  • -b, –background: デーモンプロセスをバックグラウンドで実行することを指定します。
  • -m, –make-pidfile: プロセスIDファイルを作成することを指定します。
  • -p, –pidfile PIDFILE: プロセスIDファイルの場所を指定します。
  • -c, –chuid USER:GROUP: デーモンプロセスを実行するユーザーとグループを指定します。
  • -d, –chdir DIR: デーモンプロセスが実行されるディレクトリを指定します。
  • -e, –exec EXEC: デーモンプロセスを開始するための実行可能ファイルを指定します。
  • -u, –user USER: デーモンプロセスを実行するユーザーを指定します。
  • -g, –group GROUP: デーモンプロセスを実行するグループを指定します。
  • -s, –signal SIGNAL: デーモンプロセスに送信するシグナルを指定します。
  • -k, –stop: デーモンプロセスを停止することを指定します。
  • -n, –name NAME: デーモンプロセスの名前を指定します。
  • -R, –retry RETRY: リトライ回数を指定します。
  • –oknodo: プロセスが既に実行中の場合に何もせずに成功とします。
  • –startas STARTAS: 新しいプロセスの名前を指定します。
  • –test: コマンドを実行せず、デバッグ情報を表示します。
  • –version: バージョン情報を表示します。

これらのオプションを組み合わせると、デーモンプロセスを開始、停止、再起動、制御することができます。

startstopdaemon start background pidfile $PIDFILE makepidfile user $DAEMON_USER chuid $DAEMON_USER startas $DAEMON $DAEMON_OPTS

startup.sh

実行するコマンドを記載するだけです。

#!/bin/sh
echo “Hello start” >> /opt/plcnext/log.txtpodman network create podmanpodman start mqttpodman start mqttpodman start mqttpodman start mynoderedecho “end…” >> /opt/plcnext/log.txt

Useful link

https://www.plcnext.help/te/Service_Components/Using_OCI_containers.htm

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする