一种基于FIFO命名管道的systemd服务命令行交互接管方法及系统与流程

摘要: 本发明涉及linux系统服务管理,特别涉及一种基于fifo命名管道的systemd服务命令行交互接管方法及系统。背景技术:1、在linux操作系统中,syste...
一种基于FIFO命名管道的systemd服务命令行交互接管方法及系统与流程

本发明涉及linux系统服务管理,特别涉及一种基于fifo命名管道的systemd服务命令行交互接管方法及系统。

背景技术:

1、在linux操作系统中,systemd是主流的系统和服务管理器。当应用程序注册为systemd服务后以守护进程方式运行,其标准输入被关闭或连接到空设备,标准输出和标准错误被重定向至日志系统。许多应用程序内置了基于标准输入输出的命令行接口,用于运行时配置、状态查询和故障诊断。当这类应用程序部署为systemd服务后,其命令行接口功能不可用。现有的解决方案通常需要对服务端程序进行修改,包括增加独立的通信协议监听端口、集成总线通信框架或嵌入网络服务接口,这些方案均需要修改服务端源代码、增加系统依赖并提高实现复杂度。

技术实现思路

1、针对现有技术中应用程序注册为系统服务后标准输入输出被关闭导致其内置命令行接口功能不可用,而现有解决方案均需修改服务端源代码的不足,本申请提供了一种基于fifo命名管道的systemd服务命令行交互接管方法及系统。该方法通过创建命名管道并利用shell重定向将服务进程的标准输入输出透明接入管道,配合管道保持器进程维持管道通路并消费闲置输出,以及客户端通过管道实现交互式通信,能够在无需修改服务端程序源代码的前提下恢复其命令行交互能力。

2、具体地,本申请提供了以下技术方案:

3、第一方面,本申请提供了一种基于fifo命名管道的systemd服务命令行交互接管方法,包括:

4、创建输入命名管道和输出命名管道;

5、通过启动脚本启动服务进程,所述启动脚本利用shell重定向将所述服务进程的标准输入重定向至所述输入命名管道,将所述服务进程的标准输出和标准错误重定向至所述输出命名管道,其中,所述启动脚本先启动管道保持器进程,再启动所述服务进程;

6、所述管道保持器进程保持所述输入命名管道和所述输出命名管道的读端与写端处于持续开启状态,并在检测到无客户端连接时,读取并丢弃所述输出命名管道中的数据;

7、客户端以写方式打开所述输入命名管道并写入命令、以读方式打开所述输出命名管道并读取响应,实现与所述服务进程的交互式通信。

8、可选地,通过启动脚本启动所述服务进程包括:

9、所述启动脚本以后台方式启动所述管道保持器进程,以前台方式启动所述服务进程;

10、所述服务进程以前台方式运行,使系统服务管理器监控其生命周期并在所述服务进程退出时触发自动重启;

11、所述shell重定向采用追加模式将所述标准输出写入所述输出命名管道。

12、可选地,所述管道保持器进程保持所述输入命名管道和所述输出命名管道的读端与写端处于持续开启状态包括:

13、创建多个线程,分别以只读模式和只写模式打开所述输入命名管道,以只读模式和只写模式打开所述输出命名管道,通过多线程并行执行突破命名管道的双端互等阻塞特性。

14、可选地,所述管道保持步骤中,管道保持器进程检测客户端连接状态包括:

15、通过共享内存区域获取所述客户端的进程标识,并通过检查所述进程标识对应的进程是否存活来判断所述客户端是否处于连接状态;

16、当所述进程标识为零或所述进程标识对应的进程已不存在时,判定无客户端连接。

17、可选地,所述管道保持器进程读取并丢弃所述输出命名管道中的数据时,所述方法还包括:

18、对所述输出命名管道的读端设置非阻塞标志;

19、以固定间隔的轮询周期进行周期性读取,当管道中有数据时立即读取并丢弃,当管道中无数据时读取操作立即返回而不阻塞。

20、可选地,所述方法还包括:

21、所述客户端启动时将自身进程标识写入所述共享内存区域;

22、所述客户端以非阻塞方式清空所述输出命名管道中的历史残余数据后进入交互循环。

23、可选地,所述方法还包括:

24、所述客户端从所述服务进程所使用的命令行解析库中裁剪复用行编辑引擎、命令解析框架和历史记录功能;

25、所述客户端将输入输出层改为通过所述输入命名管道和所述输出命名管道通信。

26、可选地,所述客户端在向所述输入命名管道写入命令后,从所述输出命名管道读取响应数据,在预设超时时间内持续读取直至无新数据到达后返回命令提示符。

27、第二方面,本申请提供了一种基于fifo命名管道的systemd服务命令行交互接管系统,包括:

28、管道模块,包括输入命名管道和输出命名管道;

29、服务启动模块,包括服务单元配置和启动脚本,所述启动脚本启动管道保持器进程和服务进程,并通过shell重定向将所述服务进程的标准输入输出接入所述管道模块;

30、管道保持器模块,用于保持所述管道模块中各管道的读端与写端处于持续开启状态,检测客户端连接状态,并在无客户端连接时读取并丢弃所述输出命名管道中的数据以防止所述服务进程写阻塞;

31、客户端模块,通过写入所述输入命名管道发送命令、读取所述输出命名管道接收响应,实现与所述服务进程的交互式通信。

32、可选地,所述管道保持器模块和所述服务启动模块配置为随系统服务管理器自动启动,所述管道保持器模块在所述服务进程崩溃重启后仍持续维持管道可用性,使得服务重启对所述客户端模块透明。

33、本申请的有益效果在于:

34、通过利用操作系统内核原生的命名管道机制和shell重定向语法,在服务启动阶段将服务进程的标准输入输出透明接入命名管道,配合管道保持器进程持续维护管道通路并在无客户端连接时主动消费输出数据防止服务阻塞,使得客户端能够通过管道与服务进程进行交互式命令行通信。同时,服务进程仍然通过标准输入输出进行读写操作,其原有的基于标准输入输出的命令行逻辑完全保留并正常工作,从而在无需修改服务端程序任何源代码的前提下实现了对系统服务命令行交互能力的接管。而管道保持器进程作为轻量级后台进程维护管道的持续可用性,使得服务进程崩溃重启后新进程通过相同的重定向机制接入管道,对客户端透明。

1.一种基于fifo命名管道的systemd服务命令行交互接管方法,其特征在于,包括:

2.根据权利要求1所述的方法,其特征在于,通过启动脚本启动所述服务进程包括:

3.根据权利要求1所述的方法,其特征在于,所述管道保持器进程保持所述输入命名管道和所述输出命名管道的读端与写端处于持续开启状态包括:

4.根据权利要求1所述的方法,其特征在于,管道保持器进程检测客户端连接状态包括:

5.根据权利要求4所述的方法,其特征在于,所述管道保持器进程读取并丢弃所述输出命名管道中的数据时,所述方法还包括:

6.根据权利要求4所述的方法,其特征在于,所述方法还包括:

7.根据权利要求1所述的方法,其特征在于,所述方法还包括:

8.根据权利要求1所述的方法,其特征在于,所述客户端在在向所述输入命名管道写入命令后,从所述输出命名管道读取响应数据,在预设超时时间内持续读取直至无新数据到达后返回命令提示符。

9.一种基于fifo命名管道的systemd服务命令行交互接管系统,其特征在于,包括:

10.根据权利要求9所述的系统,其特征在于,所述管道保持器模块和所述服务启动模块配置为随系统服务管理器自动启动,所述管道保持器模块在所述服务进程崩溃重启后仍持续维持管道可用性,使得服务重启对所述客户端模块透明。