Lua Sandbox の実装を検索できます。たとえば、このwiki ページとSO の質問は、いくつかの指針を提供します。サンドボックス化の取り組みのほとんどは、不正なコードの実行を許可しないことに重点を置いていますが、必ずしも無限ループを防止することに重点を置いているわけではないことに注意してください。より適切に制御するには、Lua サンドボックスをLXCやcpulimitなどと組み合わせる必要がある場合があります。(コメントに基づいて関係ありません)
Lua ベースの軽量なものを探しているが、必ずしも 100% 確実であるとは限らない場合は、別のコルーチンでクライアント コードを実行し、そのコルーチンにデバッグ フックを設定して、N 行ごとにトリガーすることができます。そのフックでは、実行中のプロセスが引用符を超えたかどうかを確認できます。また、独自のフックを設定する必要があるため、新しいコルーチンを開始する必要があります (coroutine.create/wrap を無効にするか、必要なデバッグ フックを設定するものに置き換える必要があります)。
この場合のコードは次のようになります。
local coro = coroutine.create(client_func)
debug.sethook(coro, debug_hook, "l", 1000) -- trigger hook on every 1000th line
一部のIO操作でブロックされる可能性があり、デバッグフックはそこで役に立たないため、絶対確実ではありません。
[更新された質問とコメントに基づいて編集]
「lua コード コルーチン ベースのコントローラーなし」と「外部プロセス制御メカニズムなし」の間で、多くの選択肢が残されているとは思いません。唯一のオプションは、ユーザー スクリプトごとに 1 つの VM を実行し、何らかの方法でそれらの VM にティックを与えることかもしれません (SO に関する最近の質問がありましたが、見つかりません)。このルートに進む前に、私はまだコルーチンでこれをやろうとしていました (これは簡単に数万に拡張できるはずです。Tir は、コルーチンベースのアーキテクチャで100 万人のアクティブ ユーザーをサポートしていると主張しています)。
メカニズムは大まかに次のようになります。上に示したようにデバッグ フックをインストールし、そのフックからコントローラーに戻ります。コントローラーは再開する他のコルーチン (ユーザー スクリプト) を決定します。私が開発してきたLua デバッガーでは、まさにこのメカニズムが機能しています(ただし、1 つのクライアント スクリプトに対してのみ機能します)。これでは、ブロックされる可能性のある IO 呼び出しから保護されません。そのためには、VM レベルでウォッチドッグを使用して、必要以上に長くブロックされていないかどうかを確認する必要がある場合があります。
upvalue などを保持する実行中のコード フラグメントをシリアライズおよびデシリアライズする必要がある場合は、おそらくPlutoが唯一の選択肢です。