如何使用 sed 作为守护程序或服务来解析传入的 JSON 字符串?
Posted
技术标签:
【中文标题】如何使用 sed 作为守护程序或服务来解析传入的 JSON 字符串?【英文标题】:How can I use sed as a daemon or service to parse incoming JSON strings? 【发布时间】:2020-07-17 21:21:32 【问题描述】:我正在构建一个解析引擎,它将 JSON 字符串作为输入,解析 JSON 字符串,并输出解析后的 JSON 字符串。我希望解析引擎作为守护程序或服务运行,因此我可以使用 Docker 部署它。它需要极高的性能,因为它会解析大量数据。
我知道我可以有一个脚本,它将 sed 作为后台进程启动。但是,似乎启动和重新启动进程会产生开销,从而降低性能。我正在考虑将 sed 作为守护程序或服务运行,这可能使我能够方便地使用现有的、经过严格审查的工具,同时最大限度地提高系统性能。
此外,如果 awk 或其他现有工具更适合此目的,我愿意接受其他选择。但是,如果可能的话,我希望它成为一个经过严格审查的 Linux/Unix 工具,以避免重新发明***。
我读到了这个SO question。 this one 将 emacs 作为守护进程运行。但是,两者似乎都不适用于 sed。
我也考虑过在守护进程中将标准输入管道传输到 sed,但不确定这是否是最好的方法。
更新 我想问的关键问题是:如何将 sed、awk 或 jq 作为守护进程运行,以便将许多字符串传递给它,而不会产生启动新进程的开销?
【问题讨论】:
不确定“解析的 JSON 字符串”是什么样的,但 jq 可能是比 awk 或 sed 更好的选择。 我没有投票结束;近距离投票表明“需要更多关注”。 使用命名管道有意义吗?有点像这里描述的:hackaday.com/2019/07/12/linux-fu-named-pipe-dreams 如果您的问题只是作为守护进程运行,您可以在Run bash script as daemon 或“Proper” way to run shell script as a daemon 下找到答案。 我可以结合@ranga 和@U880D 提供的解决方案并运行一个脚本,从而运行一个linux 进程,作为使用命名管道重定向其输入/输出的守护进程。这肯定会满足我的次要需求,但我的关键问题是如何将进程本身作为守护进程运行,因此不需要每次通过 bash 脚本中的循环重新实例化它。使用sed
、awk
或jq
可能无法实现。只是想看看是不是。我的问题的关键部分是,“不会产生启动新进程的开销”。但是,非常感谢发布的所有解决方案。
【参考方案1】:
(评论太大了)
按照我的理解,sed
、awk
etc 等经典的 unix 文本处理工具被编写为过滤器,它们处理输入流并产生输出流。它们不是为守护进程而构建的,它们在处理输入流后终止。输入流上的EOF
最终将终止过滤器。所以你必须keep that pipe open。
如果您不喜欢使用 shell 脚本包装工具的想法,也许需要保持管道打开、将进程变为守护进程并稍后关闭打开的文件描述符以正常终止进程所需的功能在共享库的构造函数/析构函数 (init/fini) 中实现,可以在运行工具时预加载(使用LD_PRELOAD
)。
如果您选择实现类似的东西,daemonize 项目可能是一个很好的起点。
【讨论】:
以上是关于如何使用 sed 作为守护程序或服务来解析传入的 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Python 脚本像 Linux 中的服务或守护程序一样运行