是否有与长时间运行的进程进行通信的标准linux/unix模式?在linux中通过shell脚本与正在运行的进程进行通信的标准方式
例如,我有几百个进程,用C++编写,并在各种机器上运行,我想通过shell脚本向它们发送一条命令,例如重新加载配置,启动,停止等。
是否有与长时间运行的进程进行通信的标准linux/unix模式?在linux中通过shell脚本与正在运行的进程进行通信的标准方式
例如,我有几百个进程,用C++编写,并在各种机器上运行,我想通过shell脚本向它们发送一条命令,例如重新加载配置,启动,停止等。
既然你还在乎远程进程,并假设您可以修改所有程序的源代码,你可以考虑某种方式与他们沟通:
定义自己的小文本协议,让每个进程在某个套接字或某个命名管道上侦听。你可能会需要一些复系统调用像poll
利用现有的库和工具,如MPI,Corba,或者D-Bus或ONC/RPC/XDR
改变应用程序的配置文件,并有信号约定,例如捕获SIGHUP
重新加载配置,然后SIGTERM
正确终止它(但无法远程发送信号;您需要例如ssh
某些kill
命令)。
如果你试图触发起步一样简单的动作/为你所描述停止/重装配置,最常用的方法是使用signals。
从shell脚本中,您可以使用kill
命令将特定信号发送到特定进程。 在您的过程中,您将实现一个或多个信号处理程序。信号处理程序通过使用signal()
函数或sigaction()
函数进行注册以接收一个或多个信号。
通常情况下,SIGHUP
用于触发重新加载配置。 SIGSTOP
和SIGCONT
可能适用于暂停和恢复。
man 7 signal
会显示可供选择的可用信号的完整列表。
如果您需要触发更复杂的动作,您可以创建一个命名管道。让你的进程创建管道,并从你的shell脚本,只有echo
命令。
命名管道更安全。信号的缺点是,从学习PID到发出'kill $ PID'的时间,系统_应该已将PID重新分配给不同的进程。也许不太可能,但很可能a)你学习你的过程的PID,b)你的过程死掉,c)一个新的过程开始,d)操作系统选择你认为属于你的过程的PID。使得e)向该PID发送杀死错误的事情。 – 2015-11-12 22:35:52
选项#3(信号)的缺点是,从您学习PID到发出'kill $ PID'的时间,系统_应该已将该PID重新分配给不同的进程。也许不太可能,但很可能a)你学习你的过程的PID,b)你的过程死掉,c)一个新的过程开始,d)操作系统选择你认为属于你的过程的PID。使得e)向该PID发送杀死错误的事情。 – 2015-11-12 22:34:26