Lua スクリプト機能

$Date: 2016/08/24 02:21:01 $


概要

 ヤマハルーターで Lua スクリプト ( 参考: lua.org の ホームページ ) が実行できます。Lua スクリプトにヤマハルーター専用 API を埋め込むことで、ルーターの状態に応じて、ルーターの設定変更やアクションをプログラミングすることが可能になります。例えば、次のようなスクリプトを作成できます。

 なお、ヤマハルーター専用 API はこちらのページで公開しています。API は随時追加していく予定です。また、ヤマハルーターが実装している Lua のバージョンは 5.1.4 または 5.1.5 です。詳細は Lua スクリプト機能バージョンの変更履歴を参照してください。

ヤマハが実装している Lua 言語の仕様については、Lua 言語の文法ライブラリ関数を参照してください。また、Lua チュートリアルはプログラミング初心者向けのチュートリアルです。

オリジナルの Lua 言語の仕様については、Lua 5.1 Reference Manual を参照してください。


対応機種とファームウェアリビジョン

ヤマハルーターでは以下の機種およびファームウェアで、Lua スクリプト機能をサポートしています。

機種ファームウェア
NVR510 Rev.15.01.02以降
NVR700W Rev.15.00.02以降
RTX1210 Rev.14.01.05以降
RTX5000 Rev.14.00.08以降
RTX3500 Rev.14.00.08以降
FWX120 Rev.11.03.02以降
RTX810 Rev.11.01.04以降
NVR500 Rev.11.00.06以降
RTX1200 Rev.10.01.16以降
SRT100 Rev.10.00.52以降

Lua スクリプト機能バージョンの変更履歴

Lua スクリプト機能バージョンの変更履歴と、各機種のファームウェアリビジョンとの対比表です。

_RT_LUA_VERSION 変更内容 対応ファームウェア
NVR510 NVR700W RTX1210 RTX5000 RTX3500 FWX120 RTX810 NVR500 RTX1200 SRT100
"1.0" 初期リリース Rev.15.01.02
以降
Rev.15.00.02
以降
Rev.14.01.05
以降
Rev.14.00.08
以降
Rev.14.00.08
以降
Rev.11.03.02
以降
Rev.11.01.04
以降
Rev.11.00.06
以降
Rev.10.01.16
以降
Rev.10.00.52
以降
"1.01" 以下の機能を追加した
  • BIGNUM を使用できるようにした
  • ビット演算ライブラリを追加した
  • math ライブラリの一部の関数を使用できるようにした
Rev.10.01.22
以降
Rev.10.00.56
以降
"1.02" 以下の機能を追加した
  • ハードウェアライブラリを追加した
  • HTTPクライアント機能 ( rt.httprequest 関数 ) を追加した
Rev.10.01.24
以降
"1.03" 以下の機能を追加した
  • 正規表現オブジェクトを生成する string.regexp 関数を新設した
    また、正規表現糖衣構文により、string.regexp 関数を呼び出せるようにした
  • 以下の各関数で、パターンとして正規表現オブジェクトを利用できるようにした
    • string.find
    • string.match
    • string.gmatch
    • string.gsub
    • string.split
    • rt.syslogwatch
  • 文字列をパターンで分割する string.split 関数を新設した
  • 引数列あるいは配列の要素を巡回する each 関数を新設した
Rev.11.00.13
以降
Rev.10.00.60
以降
"1.04"

ハードウェアライブラリで、USBキーボードやUSBバーコードリーダーの出力を読み取れるようにした

Rev.11.00.16
以降
Rev.10.01.32
以降
"1.05" 以下の変更をした
  • ベースとなる Lua をバージョン 5.1.5 にした
  • rt.mail 関数で、メール本文の先頭にルーターの情報を挿入するか否かを指定できるようにした
Rev.11.01.06
以降
Rev.11.00.20
以降
Rev.10.01.42
以降
Rev.10.00.61
以降
"1.06" LuaSocketに対応した Rev.11.01.09
以降
"1.07" rt.command 関数で、コマンド実行のログを出力するか否かを指定できるようにした Rev.14.01.11
以降
Rev.14.00.18
以降
Rev.14.00.18
以降
Rev.11.03.13
以降
Rev.11.01.25
以降
Rev.11.00.28
以降
Rev.10.01.65
以降
-

Lua スクリプト機能バージョンの新しいファームウェアは、基本的に以前のバージョンでサポートする機能を含みます。詳細は Lua 言語の文法ライブラリ関数を参照してください。


用語の定義

Lua タスク ...
Lua スクリプトを実行するためにルーターの OS に用意されている専用のタスクです。 lua コマンド用に 8 個、DOWNLOAD ボタンからの実行用に 1 個、Lua コンパイラ用に 1 個の計10個 (*1) が予め用意されています。それぞれのタスクは独立しているので Lua タスクの最大数まで同時走行が可能です。

(*1) DOWNLOAD ボタン非搭載機種、および、SRT100では、DOWNLOADボタンからの実行用のタスクを除く、9個のタスクが用意されています。


詳細

  1. Lua スクリプトの実行方法と実行環境

    管理ユーザー権限でルーターにログインして lua コマンドを実行したり、DOWNLOAD ボタンを押すことで指定した Lua スクリプトを開始させることができます。lua コマンド は Lua 標準の lua コマンドオプションのうち、標準入力 ( stdin ) をスクリプトの入力対象とする -i / - オプションや、パラメータなしの実行には対応していません。Lua スクリプトを開始させる手段には次のものがあります。

    1. シリアルコンソール、および、TELNET / SSH クライアントからの lua コマンド実行
    2. リモートセットアップ機能を利用した lua コマンド実行
    3. GUI のコマンド実行画面からの lua コマンド実行
    4. schedule at コマンドを利用した lua コマンドの自動実行 ( 定時実行やルーター起動時の実行など )
    5. DOWNLOAD ボタンの長押し ( DOWNLOAD ボタン非搭載機種、および、SRT100 を除く )

    lua コマンドの実行例を下記に挙げます。

    lua コマンドは、指定した Lua スクリプトを開始させるトリガーに過ぎないため、Lua スクリプトの終了を待たずにコマンドプロンプトが返ります。そのため、同一コンソール上から連続的に同コマンドを実行して複数の Lua スクリプトを立ち上げることが可能です。ただし、同時に走行可能な Lua スクリプトの上限数は 8 です。Lua スクリプト機能では 1 度の lua コマンド実行につき 1 つの Lua タスクが割り当てられるため、同時に走行しているスクリプトの数だけ Lua タスクが使用されることになります。なお、(例 3) のように、1 度の lua コマンドで複数の Lua スクリプトを指定する場合は、複数の Lua スクリプトが 1 つの Lua タスク内で指定した順番に実行されます。Lua スクリプトの走行状態や過去の実行状況などは show status lua コマンドから確認できます。また、走行中の Lua スクリプトを強制終了させたいときは、terminate lua コマンド を使用します。

    実行した lua コマンドや Lua スクリプトの中に文法エラーがあった場合は、INFO タイプのエラーメッセージが SYSLOG に出力され、スクリプトの実行が中断されます。

    [SYSLOG例]
    
    2009/09/21 12:20:07: lua: mail.lua:26: 'rt.mail': 'text' field value of argument #1 is invalid.
    

    また、スクリプトファイルの重複チェック等は行われないため、同時に同一のスクリプトファイルを指定して lua コマンドを実行した場合は、同一のスクリプトファイルが複数の Lua タスクで走行することになります。操作ミスをした場合は、terminate lua コマンド で不要な Lua タスクを強制終了させてください。

    DOWNLOAD ボタンによる実行について ( DOWNLOAD ボタン非搭載機種、および、SRT100 を除く )

    DOWNLOAD ボタンからはスクリプトファイルを 1 つだけ実行させることができます。lua コマンドのような複雑な操作は行えません。

    DOWNLOAD ボタンを使用して Lua スクリプトを開始させる場合は 1 つの Lua タスクしか割り当てられません。ただし、lua コマンド の実行時に割り当てられる 8 個の Lua タスクとは別に DOWNLOAD ボタン専用の Lua タスクが用意してあるため、lua コマンド 用の Lua タスクに空きが無くても、DOWNLOAD ボタンから Lua スクリプトを開始させることができます。DOWNLOAD ボタンによる実行方法について下記に述べます。
    (※) DOWNLOAD ランプがない機種では、DOWNLOAD ランプの点灯、点滅はありません。

    常駐型の Lua スクリプトについて

    専用の Lua タスクで実行されるため、プログラムに終了がない常駐型の Lua スクリプトを走行させることが可能です。Lua タスクは CPU リソースの使用に制限を設けていますが、実行するスクリプトの内容によっては CPU 使用率が 100% 近く上がることがあります。したがって、スクリプトプログラムの方でも CPU 使用率が高くならないような配慮が必要です ( 注意事項 参照 )。


  2. ファイル I / O

    スクリプトファイルはルーター内蔵のフラッシュ ROM ( RTFS )、または、外部メモリに保存できます。RTFS とは、ルーター内蔵のフラッシュ ROM 上に構築されているファイルシステムのことです。lua コマンドoperation button function download コマンドでスクリプトファイルを指定する場合は、その格納場所を絶対パス、もしくは、環境変数 PWD からの相対パスで指定します。絶対パス指定では、外部メモリを指すファイルパスには搭載している外部メモリポートに従い "usb1:" 、 "sd1:" というようなプレフィックスを付けます。外部メモリを示すプレフィックスが記述されていない場合は、RTFS を示すファイルパスと判別されます。相対パス指定では、環境変数 PWD により、外部メモリと RTFS のいずれかに判別されます。なお、スクリプトファイルの暗号化には対応していません。

    ファイルシステムの操作方法は技術資料 ( RTFS / 外部メモリの利用 ) を参考にしてください。

    (例 4) は、PWD に "/lua" が設定されていれば (例 1) と同じ意味になり、"usb1:/lua" が設定されていれば (例 2) と同じ意味になります。

    また、Lua 標準関数にあるファイル操作系関数も同様にルーター内蔵のフラッシュ ROM 、または、外部メモリを対象とすることができ、それぞれのデバイス上でファイルの生成と読み書きが行えます。ファイル操作系関数の引数のファイル名にも絶対パスと相対パスが使用できます。なお、フラッシュ ROM への頻繁な書き込みはデバイスの消耗を早めることになるので、繰り返しフラッシュ ROM への書き込みを行うようなスクリプトの実行には注意してください ( 注意事項 参照 )。

    定義済みファイルディスクリプタの標準入力 ( stdin ) / 標準出力 ( stdout ) / エラー出力 ( stderr ) には対応していないため、それらを指定することはできません。ただし、Lua 標準関数の print( ) 関数は使用可能です。print( ) 関数の出力先は lua コマンドを実行したルーターコンソールになりますが、Lua スクリプトが schedule at コマンド、または、DOWNLOAD ボタンをトリガーにして実行されたときの print( ) 関数では何も出力されません。


  3. Lua の標準関数

    ヤマハルーターが実装している Lua のバージョンは 5.1.4 / 5.1.5 です。Lua 5.1.4 / 5.1.5 がサポートしている標準関数のうち、ヤマハルーターでは使用できない関数や使用方法に制限がある関数があります。ここに挙がっていない関数は標準の仕様で使用可能です。

    使用できない関数

    使用方法に制限がある関数



  4. Lua のグローバル変数

    Lua 標準では "_VERSION" のように予約済みのグローバル変数があり、それらはスクリプト内でその変数名を指定するだけで参照することができます。ここではルーター用に新たに追加している予約済みのグローバル変数について説明します。

    _RT_LUA_VERSION
    _RT_LUA_VERSION_NUM

    ベースとなる Lua のバージョン ( _VERSION ) からさらに、ルーター独自のカスタマイズを加えた当機能のバージョンが設定されています。当機能の初期リリース時は _RT_LUA_VERSION には "1.0" という文字列が設定されており、当機能の仕様拡張やルーター用 API の追加に伴い、バージョン番号が上がっていきます。_RT_LUA_VERSION_NUM はバージョンを数値で表したもので、上一桁でメジャー番号、下二桁でマイナー番号を示す三桁の整数になっています。"1.0" の場合、_RT_LUA_VERSION_NUM == 100 となります。API を新旧のルーターファームウェアで使い分ける必要がある場合などに、当変数で切り分けることができます。

    _RT_FIRM_REVISION

    ルーターファームウェアのリビジョンを示す文字列が設定されています。


  5. ルーターの環境変数

    よく使うアドレスや文字列、もしくは、ルーターごとに異なる設定値などを、set コマンドで環境変数に設定しておくことができます。設定した環境変数は Lua 標準関数の os.getenv( ) で参照します。Lua スクリプトを各ルーターで共通化したい場合などに便利です。

    次に、Lua スクリプト機能の内部で参照される環境変数について説明します。

    LUA_INIT(大文字指定)

    LUA_INIT には、Lua の開始時に事前に実行させるスクリプトを設定します。LUA_INIT が設定されている場合は、lua コマンド等で指定したスクリプトの開始前に必ずそのスクリプトが実行されるようになります。設定値は、先頭に "@" がある場合はスクリプトファイルを指すパスと認識され、それ以外はスクリプト文字列と認識されます。

    LUA_INIT のデフォルト値は設定されていません。

    LUA_PATH(大文字指定)

    LUA_PATH には、Lua 標準関数の require( ) が Lua のモジュールをロードするために使用するパスを設定します。Lua ではモジュール名の置換記号として "?" を使いますが、ルーターコンソールで "?" を入力するとヘルプが表示されてしまうため、"?" を入力する前にエスケープシーケンスの "\" を入力してください。

    LUA_PATH が設定されていない場合は、" ./?.lua; " がデフォルトのパスとして使用されます。

    (注) 当機能では、require( ) で C のモジュールをロードすることはできません。したがって、LUA_CPATH は使用されません。

    PWD(大文字指定)

    PWD には、スクリプトファイルを指す相対パスの基点となるパスを絶対パスで設定します。lua コマンド等でスクリプトファイルを相対パスで指定する場合、この PWD が基点になります。末尾の " / " はなくても構いません。
    PWD が設定されていない場合は、" / " ( RTFS のルート ) がデフォルトのパスとして使用されます。


  6. ヤマハルーター専用 API

    ヤマハルーター専用 API を使用することで、ルーターの操作をプログラミングすることができます。API は随時追加していく予定です。

    Lua 向けヤマハルーター専用 API の公開ページ


  7. Lua コンパイラ ( Luac )

    luac コマンドを実行することで Lua スクリプトをコンパイルしてバイトコード ( 中間言語 ) を生成できます。標準の luac コマンドオプションのうち、標準入力 ( stdin ) を入力対象とする - オプションには対応していません。Lua コンパイラは同時に 1 つだけ起動することができます。lua コマンドとは違い、コンパイルが終了するまでコマンドプロンプトは返らないため、実行中は "CTRL + C" で強制終了することができます。なお、luac コマンドshcedule at コマンドには指定できません。

    また、生成されたバイトコードファイルを lua コマンド等の実行対象ファイルに指定して実行することもできます。少しでも Lua スクリプトの実行負荷を下げたい場合や、保存しているスクリプトファイルを一見しただけではその内容がわからないようにしたい場合に有効な方法です。なお、ルーター上で生成したバイトコードだけが実行可能であり、Lua をインストールした PC 等で生成したバイトコードは実行できません。



注意事項


コマンド


設定例

  1. ルーターの再起動時にリブート情報をメールで送信する

    [ config に必要な設定 ]
    schedule at 1 startup * lua /lua/restart.lua
    

    ルーターの起動時に Lua スクリプトを実行するスケジュールを設定します。その他、基本的な経路設定などは既に設定されているものとします。

    [ Lua スクリプト ]
    -- ### restart.lua ###
    
    ------------------------------------------------------------
    -- ルーターコマンドを実行し、出力結果を整形して返す関数   --
    ------------------------------------------------------------
    function exec_command(cmd)
    	local rtn, str
    	local text
    
    	rtn, str = rt.command(cmd)
    	if (rtn) and (str) then
    		text = string.format("\"%s\"の実行結果\r\n\r\n%s\r\n", cmd, str)
    	else
    		text = string.format("\"%s\"の実行失敗\r\n\r\n", cmd)
    	end
    
    	return text
    end
    
    ------------------------------------------------------------
    -- メイン部分                                             --
    ------------------------------------------------------------
    mail_table = {
    	smtp_address = "smtp.xxxx.co.jp",            -- 適宜変更
    	from = "rt-admin@xxxx.co.jp",                -- 適宜変更
    	to = "rt-admin@xxxx.co.jp",                  -- 適宜変更
    	subject = "ルーターが再起動しました"
    }
    
    -- 情報収集
    mail_table.text = exec_command("show status boot all")
    mail_table.text = mail_table.text .. exec_command("show log")
    
    -- メール送信
    rt.mail(mail_table)
    

    上記の restart.lua というテキストファイルを作成し、RTFS の /lua 配下に保存しておきます。保存方法はこちらを参照してください。

    [ スクリプトの説明 ]
    • /lua/restart.lua
      "show status boot all" と "show log" の実行結果を管理者にメールで送信するスクリプトです。このスクリプトを起動時に実行させるようにスケジュールの設定をしておけば、ルーターが再起動したことをすぐに知ることができ、解析に必要な情報も一緒に得られます。


  2. WAN の通信状況に応じて QoS を設定し、一定間隔で監視状況をメールで送信する

    [ ネットワーク構成 ]
    • 本社-東京支社間でIPsec-VPN接続
    • 東京支社はプロバイダへ端末型接続
    • パケットロスが多い時間帯だけ QoS をかける
    ネットワーク構成
    [ 東京支社ルーターの config 例 ]
    set GATEWAY=172.16.10.254
    set LUA_INIT=@/lua/init.lua
    set PWD=/lua/tokyo
    
    ip route default gateway 172.16.10.254
    ip route 192.168.1.0/24 gateway tunnel 1
    ip lan1 address 192.168.2.1/24
    ip lan2 address 172.16.10.1/24
    ip lan2 nat descriptor 1
    
    tunnel select 1
     ipsec tunnel 101
      ipsec sa policy 101 1 esp aes-cbc sha-hmac anti-replay-check=off
      ipsec ike always-on 1 on
      ipsec ike pre-shared-key 1 text PASSWORD
      ipsec ike remote address 1 172.16.2.1
     tunnel enable 1
    ipsec auto refresh on
    
    nat descriptor type 1 masquerade
    nat descriptor address outer 1 primary
    nat descriptor masquerade static 1 1 192.168.2.1 udp 500
    nat descriptor masquerade static 1 2 192.168.2.1 esp
    
    [ config の説明 ]
    set GATEWAY=172.16.10.254
    set LUA_INIT=@/lua/init.lua
    set PWD=/lua/tokyo
    

    スクリプトで使用する環境変数の設定です。

    [ Lua スクリプト ]
    -- ### init.lua ###
    
    rt.command("clear log")
    rt.syslog("info", "[スクリプト開始]")
    

    上記の init.lua というテキストファイルを作成し、RTFS の /lua 配下に保存しておきます。保存方法はこちらを参照してください。

    -- ### ping.lua ###
    
    adr = os.getenv("GATEWAY")
    
    ------------------------------------------------------------
    -- n 回 PING を実行し、ロス率を返す関数                   --
    ------------------------------------------------------------
    function exec_ping(n)
    	local ping_cmd
    	local rtn, str
    	local loss
    
    	ping_cmd = string.format("ping -c %s -w 0.5 %s", n, adr)
    	rtn, str = rt.command(ping_cmd)
    	if (not rtn) or (not str) then
    		-- エラー
    		return -1
    	end
    
    	loss = string.match(str, "(%d+)%.%d+%%")     -- パケットロス率(NNN.N%)の整数部を抽出
    	if (not loss) then
    		loss = -1
    	else
    		loss = tonumber(loss)
    	end
    
    	return loss
    end
    
    ------------------------------------------------------------
    -- IPsec パケットを優先するための QoS を設定/解除する関数 --
    ------------------------------------------------------------
    function set_qos(set)
    	local no = ""
    
    	if (not set) then
    		no = "no "
    	end
    
    	rt.command(no .. "queue class filter 1 4 ip * * udp 500")
    	rt.command(no .. "queue class filter 2 4 ip * * esp")
    	rt.command(no .. "queue lan2 class filter list 1 2")
    	rt.command(no .. "speed lan2 80m")           -- 上り速度を考慮した値で
    	rt.command(no .. "queue lan2 type priority")
    	rt.command("save")
    end
    
    ------------------------------------------------------------
    -- メイン部分                                             --
    ------------------------------------------------------------
    local rtn, str
    
    cnt = 1
    qos = false
    show_cmd = "show status qos all"
    mail_table = {
    	smtp_address = "smtp.xxxx.co.jp",            -- 適宜変更
    	from = "admin-tokyo@xxxx.co.jp",             -- 適宜変更
    	to = "admin-tokyo@xxxx.co.jp",               -- 適宜変更
    	subject = "Ping Status",
    	text = ""
    }
    
    while (1) do
    	set_qos_flag = false
    
    	-- 10分間休止
    	rt.sleep(600)
    
    	text = os.date("%Y年%m月%d日 %H時%M分%S秒: PING 実行結果\r\n")
    
    	loss = exec_ping(arg[1])
    
    	if (loss < 0) then
    		text = text .. "PING 実行エラー"
    	else
    		text = text .. string.format("宛先:%s パケットロス率:%d%%", adr, loss)
    
    		if (loss >= 10) then
    			if (not qos) then
    				set_qos(true)
    				set_qos_flag = true
    				qos = true
    				text = text .. "\r\nQoS を設定しました"
    			end
    		elseif (loss == 0) then
    			if (qos) then
    				set_qos(false)
    				qos = false
    				text = text .. "\r\nQoS を解除しました"
    			end
    		end
    	end
    
    	-- SYSLOG へ記録
    	rt.syslog("info", text)
    	text = text .. "\r\n"
    
    	-- 6 回分をまとめてメール通知
    	mail_table.text = mail_table.text .. text .. "\r\n"
    	if (cnt < 6) then
    		cnt = cnt + 1
    	else
    		-- QoS の設定がある場合だけ"show status qos"の出力結果をメール本文に追加
    		-- ただし、QoS設定直後は意味がないので除く
    		if (qos) and (not set_qos_flag) then
    			rtn, str = rt.command(show_cmd)
    			if (rtn) and (str) then
    				text = string.format("# %s\r\n%s", show_cmd, str)
    				mail_table.text = mail_table.text .. text
    			end
    		end
    
    		-- メール送信
    		if (not rt.mail(mail_table)) then
    			rt.syslog("info", "Failed rt.mail by Lua")
    		end
    
    		-- メール送信が終わったらリセット
    		cnt = 1
    		mail_table.text = ""
    	end
    end
    

    上記の ping.lua というテキストファイルを作成し、RTFS の /lua/tokyo 配下に保存しておきます。保存方法はこちらを参照してください。

    [ スクリプトの説明 ]
    • /lua/init.lua
      LUA_INIT に設定する 初期化用スクリプトです。SYSLOG を初期化します

    • /lua/tokyo/ping.lua
      メインのスクリプトです。スクリプトの内容は次の通りです。無限ループするスクリプトなので、rt.sleep( ) が入っていることに注意してください。
      • 10 分おきに WAN 側ゲートウェイアドレスへ任意の回数 PING を送信する。
      • PING のパケットロス率が 10 % 以上のとき、IPsec パケットを優先するための QoS を設定する。
      • PING のパケットロス率が 1 % 未満のとき、QoS の設定を解除する。
      • 毎回の PING の実行結果を SYSLOG に記録する。
      • 一定回数分の PING の実行結果をまとめて管理者へメールで送信する。
      • メール送信時に QoS の設定があったときは、"show status qos all" の出力結果をメール本文に追加する。

    [ スクリプトの実行例 ]
    # lua ping.lua 30
    

    東京支社ルーターにシリアルや TELNET 経由でログインし、仮に PING の送信回数を 30 回とするなら、コマンド入力画面で上記のように入力します。PWD に "/lua/tokyo" が設定されているため、ファイルパスは "/lua/tokyo/ping.lua" と解釈されます。ping.lua は無限ループをするので、途中で終了させたい場合は terminate lua コマンドを使います。



SYSLOG メッセージ

本機能において出力される SYSLOG メッセージを以下に示します。実際に出力されるメッセージには "[LUA]" というプレフィックスが付加されます。ヤマハルーター専用 API で出力される SYSLOG メッセージについては、Lua 向けヤマハルーター専用 APIのページを参照してください。

レベル 出力メッセージ 意味
INFO Lua script function was enabled. Lua スクリプト機能を有効にした。
Lua script function was disabled. Lua スクリプト機能を無効した。
DEBUG created Lua Task(N) Lua タスク番号 N の Lua タスクを生成した。
terminated Lua Task(N) Lua タスク番号 N の Lua タスクを強制終了した。
closed Lua Task(N): success Lua タスク番号 N の Lua タスクを終了した。実行したスクリプトは正常に終了した。
closed Lua Task(N): failure Lua タスク番号 N の Lua タスクを終了した。実行したスクリプトはエラー終了した。

参考情報