環境 Lua 5.1.4 LuaJIT 2.0.0-beta9 動機 MySQLのUDFの中でLuaを実行したい。 このとき、無限ループするようなコードを実行すると、killクエリを投げても止まらないスレッドになってしまい、mysqldをkill -9するしかなくなる。 そのため、無限ループしてても時間がたてば強制終了されるように、タイムアウトを設定したい。 実装 Luaのフックを使えば、タイムアウトを実現できる。 startclock = os.clock() timeout = startclock + 3 debug.sethook(function () if os.clock() >= timeout then error('timeout') end end, '', 100000) while true do end debug.sethookの第2引数に'c', 'r',