linux中通过shell脚本与正在运行的进程通信的标准方式

linux中通过shell脚本与正在运行的进程通信的标准方式,linux,Linux,是否有用于与长时间运行的进程通信的标准linux/unix模式 例如,我有几百个进程,用C++编写,在各种机器上运行,我想通过shell脚本向他们发送一个命令,比如重新加载配置、启动、停止等。最常用的方法是使用 从shell脚本中,可以使用kill命令向特定进程发送特定信号。 在您的流程中,您将实现一个或多个信号处理程序。使用signal()函数或sigaction()函数注册信号处理程序以接收一个或多个信号 通常,SIGHUP用于触发配置的重新加载SIGSTOP和SIGCONT可能适合暂停和恢

是否有用于与长时间运行的进程通信的标准linux/unix模式


例如,我有几百个进程,用C++编写,在各种机器上运行,我想通过shell脚本向他们发送一个命令,比如重新加载配置、启动、停止等。最常用的方法是使用

从shell脚本中,可以使用
kill
命令向特定进程发送特定信号。 在您的流程中,您将实现一个或多个信号处理程序。使用
signal()
函数或
sigaction()
函数注册信号处理程序以接收一个或多个信号

通常,SIGHUP用于触发配置的重新加载
SIGSTOP
SIGCONT
可能适合暂停和恢复

将向您显示可供选择的可用信号的完整列表



如果需要触发更复杂的操作,可以创建命名管道。让您的进程创建管道,从shell脚本中,只需将代码>代码< E/P> >命令>

,因为您也关心远程进程,并且假设您可以修改所有程序的源代码,可以考虑与之通信的方式:

  • 定义您自己的小型文本协议,并让每个进程监听某个套接字或某个命名管道。您可能需要一些多路复用系统调用,如

  • 使用现有的库和工具,例如,或者

  • 更改应用程序的配置文件,并具有信号约定,例如catch
    SIGHUP
    以重新加载配置,以及
    SIGTERM
    以正确终止配置(但无法远程发送信号;您需要执行例如to
    ssh
    一些
    kill
    命令)


OP也希望能够与远程进程通信,最有可能采用主从模式。在这种情况下,信号不会有帮助,不是吗?谢谢你。我不知道这件事。看起来此链接解释了太多信号的缺点,即从您学习PID到发出
kill$PID
时,系统可能已将该PID重新分配给不同的进程。可能不太可能,但a)您很可能了解流程的PID,b)您的流程将消亡,c)启动新流程,d)操作系统选择您认为属于您流程的PID。使e)将kill发送给该PID是错误的。选项3(信号)有一个缺点,即从您学习PID到发出
kill$PID
时,系统可能会将该PID重新分配给不同的进程。可能不太可能,但a)您很可能了解流程的PID,b)您的流程将消亡,c)启动新流程,d)操作系统选择您认为属于您流程的PID。使e)向PID发送kill是错误的做法。命名管道更安全。信号的缺点是,从您学习PID到发出
kill$PID
时,系统可能已将该PID重新分配给不同的进程。可能不太可能,但a)您很可能了解流程的PID,b)您的流程将消亡,c)启动新流程,d)操作系统选择您认为属于您流程的PID。使e)向那个PID发送kill是错误的事情。