Elixir 在脚本中执行清理任务

Elixir 在脚本中执行清理任务,elixir,Elixir,我正在Elixir中构建一个命令行实用程序,并将其打包为一个escript。当可执行文件退出时,我需要运行一些清理任务 我对escript的理解是,每次从stdIn接收输入时,它都会启动应用程序。应用程序在完成输入处理后应退出,这是否正确 我的应用程序确实链接了一个监控GenServer的管理器,但据我所知,每次应用程序收到来自stdIn的新输入时,它都会重新启动 根据,您可以在应用程序模块中实现stop/1回调。我正在这样做,但回叫从未触发 如何在escript应用程序中执行清理任务?OTP应

我正在Elixir中构建一个命令行实用程序,并将其打包为一个escript。当可执行文件退出时,我需要运行一些清理任务

我对escript的理解是,每次从stdIn接收输入时,它都会启动应用程序。应用程序在完成输入处理后应退出,这是否正确

我的应用程序确实链接了一个监控GenServer的管理器,但据我所知,每次应用程序收到来自stdIn的新输入时,它都会重新启动

根据,您可以在应用程序模块中实现stop/1回调。我正在这样做,但回叫从未触发


如何在escript应用程序中执行清理任务?

OTP应用程序在启动escript时启动,并在脚本(操作系统进程)运行期间一直运行,直到主功能返回为止。一旦主功能完成,操作系统进程就会停止


要显式清理应用程序,可以在主函数末尾调用
application.stop/1
。此调用是同步的,在整个监控树终止后返回。请记住,默认关闭策略是最多等待5秒,以便进程正常终止,因此,如果您希望在某些进程中进行更长时间的清理,则需要重新查看主管中使用的子规范。

这可能与您的问题有关:启动escript时启动OTP应用程序,并且在脚本(操作系统进程)运行期间一直运行,直到主函数返回为止。一旦主功能完成,操作系统进程就会停止。你不能在主功能结束时简单地清理一下吗?谢谢你的回复。正如您所建议的,在主要功能结束时进行清理是可行的。但是,我发现有必要添加一个
:timer.sleep
调用,以确保我的(异步)清理任务在主函数返回之前完成。为什么不使清理任务同步?然后你就不需要睡觉了。尝试调用
应用程序。手动停止/1
以清理应用程序。此调用是同步的,在整个监控树终止后返回。请记住,默认关闭策略是最多等待5秒,以使进程正常终止,因此,如果您希望在某些进程中进行更长时间的清理,则需要重新查看主管中使用的子规范。