Linux 用に作成した自作のシェルスクリプトやプログラムを PLCnext の起動/終了時に自動的に実行したい場合、init.d と update-rc.d を用います。
手順概要
- PLCnext へ root でログイン
- 自動実行したいシェルスクリプトを /etc/init.d/ 直下へ配置し、権限を変更
- update-rc.d コマンドを実行し、シェルスクリプトを起動/終了時実行用のディレクトリへ登録
- PLCnext 再起動
この記事で紹介する方法で登録したシェルスクリプトはシステムの起動/終了の両方のタイミングで実行されます。条件をより細かく指定したい場合は、update-rc.d に関するサイト等をご参照ください。
手順詳細
root ログイン
TeraTerm 等を用いて PLCnext へ admin ユーザとして SSH でログインしてください。
(admin のデフォルトパスワードは、PLCnext 本体表面に印字された 8桁の英数字です。)
さらに su コマンドで root ユーザとしてログインしてください。
例:su
シェルスクリプトの配置 (/etc/init.d/) と権限変更
ここでは、起動/終了時に自動実行したいシェルスクリプトのファイル名を boot_script.sh とします (ファイル名は任意です)。
シェルスクリプト内にユーザーからの対話的な反応を待つようなコマンド (例:readコマンドなど) を決して含めないでください。PLCnext の起動処理がブロックされてウォッチドッグが働き再起動がかかるようになるため、正常に起動できなくなります。
そうなった場合は、PLCnext のファームウエアをリセットしてください。
AXC F x152 リセット手順 | PLCnext Technology
boot_script.sh を /etc/init.d/ へ配置してください。
例:cp boot_script.sh /etc/init.d/
chmod コマンドを実行し、必要な権限を自動実行したいシェルスクリプトへ与えてください。
例:chmod -v 777 /etc/init.d/boot_script.sh
シェルスクリプトの登録 (update-rc.d)
update-rc.d コマンドを実行し、シェルスクリプトを起動/終了時実行用のディレクトリへ登録してください。
例:update-rc.d boot_script.sh defaults 99
シェルスクリプトの登録解除は
update-rc.d <シェルスクリプト名> remove
例:
root@axcf2152:/opt/plcnext/# update-rc.d boot_script.sh remove
Removing any system startup links for boot_script.sh …
/etc/rc0.d/K99boot_script.sh
/etc/rc1.d/K99boot_script.sh
/etc/rc2.d/S99boot_script.sh
/etc/rc3.d/S99boot_script.sh
/etc/rc4.d/S99boot_script.sh
/etc/rc5.d/S99boot_script.sh
/etc/rc6.d/K99boot_script.sh
PLCnext 再起動
reboot コマンドでPLCnext を再起動してください。
例:reboot
シェルスクリプトの例①:起動/終了時に単純な処理を実行
単純な処理の例として日時・ランレベル・ファイル名をファイル出力するシェルスクリプトを作成し、システム起動/終了時に自動実行させます。
シェルスクリプトの作成
/opt/plcnext/ 直下に、以下の内容で boot_script.sh を作成してください。
#!/bin/bash
echo $(date)', runlevel = ['$(runlevel)'], File "'$(basename $0)'" was executed.' >> /opt/plcnext/sample.txt
シェルスクリプトの権限変更と手動でのテスト実行
以下の様に boot_script.sh の権限を変更し、正しく動くかどうかを手動でチェックします。
root@axcf2152:/opt/plcnext/# chmod -v 777 boot_script.sh
mode of 'boot_script.sh' changed from 0664 (rw-rw-r--) to 0777 (rwxrwxrwx)
root@axcf2152:/opt/plcnext/# ./boot_script.sh
root@axcf2152:/opt/plcnext/# cat /opt/plcnext/sample.txt
Wed Apr 10 07:39:51 UTC 2024, runlevel = [N 5], File "boot_script.sh" was executed.
黄色でハイライトしたとおり、/opt.plcnext/sample.txt に日時から始まるメッセージが出力されていれば OK です。
シェルスクリプトを起動/終了時実行用ディレクトリへ登録
以下の様に boot_script.sh を /etc/init.d/ 配下へコピーし、update-rc.d コマンドで起動/終了時実行用ディレクトリへ登録します。
root@axcf2152:/opt/plcnext/# cp boot_script.sh /etc/init.d/
root@axcf2152:/opt/plcnext/# update-rc.d boot_script.sh defaults 99
Adding system startup for /etc/init.d/boot_script.sh.
再起動してシェルスクリプトの自動実行を確認
reboot コマンドで PLCnext を再起動してください。
root@axcf2152:/opt/plcnext/# reboot
Broadcast message from root@axcf2152 (pts/0) (Wed Apr 10 05:35:19 2024):
The system is going down for reboot NOW!
PLCnext が起動したら、SSH でログインして /opt/plcnext/sample.txt の内容を確認してください。
admin@axcf2152:~$ cat /opt/plcnext/sample.txt
Wed Apr 10 07:39:51 UTC 2024, runlevel = [N 5], File "boot_script.sh" was executed.
Wed Apr 10 07:43:03 UTC 2024, runlevel = [5 6], File "rc" was executed.
Wed Apr 10 07:43:33 UTC 2024, runlevel = [N 5], File "rc" was executed.
黄色でハイライトしたとおり、終了時 (runlevel = [5 6]) と起動時 (runlevel = [N 5]) にシェルスクリプトが実行されたことがわかります。
シェルスクリプトの例②:起動時にPythonプログラムのバックグラウンド実行を開始
プログラムのバックグラウンド実行の例としてPython のプログラムを作成し、起動時にシェルスクリプトから Python プログラムのバックグラウンド実行を開始させます。
Python プログラムの作成
10 秒ごとにファイルへ文字列を出力する Pytyhon プログラムを用意します。
下記のテキストファイルを interval_write.py として /opt/plcnext/ 配下に用意してください。
import os
import time
def write_current_datetime(output_filename, script_filename):
while True:
current_datetime = time.strftime("%Y-%m-%d %H:%M:%S")
with open(output_filename, "a") as file:
file.write(f"[{current_datetime}] from {script_filename}\n")
time.sleep(10)
if __name__ == "__main__":
script_filename = os.path.basename(__file__) # Script file name
output_filename = "/opt/plcnext/output.txt" # Output file path
write_current_datetime(output_filename, script_filename)
Python プログラムを手動でテスト実行
以下の用に Python のプログラムをバックグラウンド実行してください。
admin@axcf2152:~$ python3 interval_write.py &
[3] 13173
以下の様に、出力ファイルの内容を tail コマンドでモニタしてください
日時で始まる文字列の行が 10 秒ごとに増えていけば成功です。
admin@axcf2152:~$ tail -f /opt/plcnext/output.txt
[2024-04-10 09:19:05] from interval_write.py
[2024-04-10 09:19:15] from interval_write.py
[2024-04-10 09:19:25] from interval_write.py
^C
モニタリングを終了するときは、Ctrl + C を押してください。
以下の様に pkill コマンドで Python のプログラムを終了させてください。
root@axcf2152:/opt/plcnext/# pkill -f interval_write.py
[1]+ Terminated python3 interval_write.py
シェルスクリプトの作成
システム起動時に Python プログラムのバックグラウンド実行を開始するシェルスクリプトを用意します。
下記の内容をboot_script2.sh として /opt/plcnext/ 配下に用意してください。
#!/bin/bash
echo $(date)', runlevel = ['$(runlevel)'], File "'$(basename $0)'" was executed.' >> /opt/plcnext/sample2.txt
case "$1" in
start)
# Process for Startup
echo " System started." >> /opt/plcnext/sample2.txt
python3 /opt/plcnext/interval_write.py &
echo " Python program started." >> /opt/plcnext/sample2.txt
;;
stop)
# Process for Shutdown
echo " System stopped." >> /opt/plcnext/sample2.txt
echo " Did nothing." >> /opt/plcnext/sample2.txt
;;
*)
echo " Usage: $0 {start|stop}"
exit 1
esac
exit 0
赤くハイライトした部分が Python プログラムのバックグラウンド実行を指示する箇所です。
シェルスクリプトの権限変更と手動でのテスト実行
以下の様に boot_script2.sh の権限を変更し、正しく動くかどうかを手動でチェックします。
青でハイライトしたとおり、シェルスクリプト名の後に引数 “start” をつけるのを忘れないでください。
root@axcf2152:/opt/plcnext/# chmod -v 777 boot_script2.sh
mode of 'boot_script2.sh' changed from 0664 (rw-rw-r--) to 0777 (rwxrwxrwx)
root@axcf2152:/opt/plcnext/# ./boot_script2.sh start
root@axcf2152:/opt/plcnext/# cat /opt/plcnext/sample2.txt
Wed Apr 10 10:19:04 UTC 2024, runlevel = [N 5], File "boot_script2.sh" was executed.
System started.
Python program started.
root@axcf2152:/opt/plcnext/# tail -f /opt/plcnext/output.txt
[2024-04-10 10:19:04] from interval_write.py
[2024-04-10 10:19:14] from interval_write.py
[2024-04-10 10:19:24] from interval_write.py
^C
黄色でハイライトしたとおり、/opt.plcnext/sample2.txt に日時から始まるメッセージが出力されていれば OK です。
また、赤でハイライトしたとおり、/opt/plcnext/output.txt の行が 10 秒ごとに増えていけば OK です。
tail によるモニタリングを終了するときは Ctrl + C を押してください。
シェルスクリプトを起動/終了時実行用ディレクトリへ登録
以下の様に boot_script2.sh を /etc/init.d/ 配下へコピーし、update-rc.d コマンドで起動/終了時実行用ディレクトリへ登録します。
root@axcf2152:/opt/plcnext/# cp boot_script2.sh /etc/init.d/
root@axcf2152:/opt/plcnext/# update-rc.d boot_script2.sh defaults 99
Adding system startup for /etc/init.d/boot_script2.sh.
再起動してシェルスクリプトとPythonプログラムの自動実行を確認
reboot コマンドで PLCnext を再起動してください。
root@axcf2152:/opt/plcnext/# reboot
Broadcast message from root@axcf2152 (pts/0) (Wed Apr 10 10:00:24 2024):
The system is going down for reboot NOW!
PLCnext が起動したら、SSH でログインして /opt/plcnext/sample2.txt の内容を確認してください。
admin@axcf2152:~$ cat /opt/plcnext/sample2.txt
Wed Apr 10 10:19:04 UTC 2024, runlevel = [N 5], File "boot_script2.sh" was executed.
System started.
Python program Started.
Wed Apr 10 10:22:39 UTC 2024, runlevel = [5 6], File "rc" was executed.
System stopped.
Did nothing.
Wed Apr 10 10:23:09 UTC 2024, runlevel = [N 5], File "rc" was executed.
System started.
Python program started.
黄色でハイライトしたとおり、システム起動時にシェルスクリプトが実行され、そこから Python プログラムが実行されたことがわかります。
続いて、tail コマンドで /opt/plcnext/output.txt の内容をモニタしてください。
admin@axcf2152:~$ tail -f /opt/plcnext/output.txt
[2024-04-10 10:23:19] from interval_write.py
[2024-04-10 10:23:29] from interval_write.py
[2024-04-10 10:23:39] from interval_write.py
日時で始まる文字列の行が 10 秒ごとに増えていけば Python プログラムがバックグラウンドで動作しています。
以上が、システム起動/終了時に任意のシェルスクリプトを実行する基本的な手順です。