向我的 Linux 守护程序应用程序发送消息的最简单方法是什么?

2024-02-18

向我的 Linux 守护程序应用程序发送消息的最简单方法是什么?有没有可能myapp foo bar可以调用回调而不是启动新进程吗?与守护进程通信的标准方式是什么?粘贴PID是我最合理的选择/var/run并创建一个命名管道或套接字?

在命令行上运行的应用程序与其守护进程进行通信的标准方式是什么?我假设当我输入时不可能要求 linux 调用回调myapp foo bar?


在命令行上运行的应用程序与其守护进程进行通信的标准方式是什么?

有多种方法可以做到这一点:

Dropbox 和信号

各种位置被用来存储包含守护进程进程 ID 号的“pid 文件”:/var/run/<app>/<app>.pid, /var/run/<app>.pid(感谢@Adam Katz 的编辑),/run/<app>/<app>.pid, /run/<app>.pid, (see Askubuntu:为什么 /var/run 被迁移到 /run? https://askubuntu.com/questions/57297/why-has-var-run-been-migrated-to-run).

当。。。的时候pid守护进程的已知信息是,命令行程序(作为单独的进程运行)可以通过以下方式与守护进程进行通信:

  1. 将一些东西写到预先安排的地方。这可以是普通文件、数据库表或服务器可读的任何方便的位置。
  2. 向守护进程发送信号。在本地执行此操作的常见方法是使用 Kill 系统调用,int kill(pid_t pid, int sig); http://linux.die.net/man/2/kill.

老派示例:服务器多路复用守护进程xinetd http://www.ibm.com/developerworks/aix/library/au-spunix-inetd/收到 SIGHUP 后会重新加载其配置文件。

发送信号方法已被冗余inotify API http://linux.die.net/man/7/inotify进程可以借此订阅文件系统事件。当您不希望守护进程执行操作时,使用信号非常有用every文件更改,因为并非每次更改都可以使文件保持有效状态,就像修改系统配置文件时一样。

先进先出或管道

fifo 或管道只是一个特殊文件,它会阻止进程读取它,直到其他进程写入它为止。您可以在文件系统中创建命名管道/fifomkfifo http://linux.die.net/man/1/mkfifo。唯一棘手的事情是管道通常应该在无缓冲的情况下打开,例如和open()相对于fopen()。脚本语言有时会为管道友好的读/写提供便利:Perl had a line-buffered模式设置为$|=1这对管道很有用。

更常见的是,您总是在命令行上看到匿名管道|符号分隔作为单独进程执行的命令。

Sockets

更新的东西怎么样,比如 mySQL?这mysql数据库系统由命令行客户端组成mysql和服务器mysqld并且还可以在本地计算机上或通过互联网为其他客户端提供服务。

mySQL 使用以下方式进行通信socket。服务器监听套接字的连接,并分叉新进程,将套接字描述符提供给子进程进行处理。当子进程完成处理后,它可以退出。

有 UNIX 套接字和 Internet 套接字,它们具有不同的命名空间。在 Linux 上用 C 语言编程套接字的指南之一是GNU C 库手册中的套接字章节 http://www.gnu.org/software/libc/manual/html_node/Sockets.html#Sockets.

无等待 I/O 是分叉进程的替代方案。这是用 C 语言完成的select()系统调用,它允许进程等待一个或多个文件上的事件,包括套接字或超时。 GNU C 库文档包括无等待 I/O 套接字服务器示例 http://www.gnu.org/software/libc/manual/html_node/Server-Example.html#Server-Example

NodeJS http://nodejs.org/是 Javascript 语言的服务器,使用无等待 I/O 编写为单线程服务器,并表明这些技术在现代系统中仍然相关。

“回调”

我假设当我输入 myapp foo bar 时不可能要求 linux 调用回调?

Maybe。但可能工作量太大,不值得这么麻烦。

当您输入时myapp foo bar输入“Linux”,那不是 Linux,您将其输入到命令 shell 中,这是一个在其自己的进程中运行的程序,与其他所有程序分开。

因此,除非您想要的功能内置在命令 shell 中,否则该命令 shell 通常无法在不启动新进程的情况下向其他程序发送消息。

许多(但不是全部)Linux 系统的默认命令 shell 是/bin/bash。与监听套接字的守护进程进行通信bash我们需要一个套接字打开过程bash。而且,果然,它存在!

一个人可以监听一个套接字bash。这是守护进程的基础:

From: Bash 中的简单套接字服务器? https://stackoverflow.com/questions/4739196/simple-socket-server-in-bash dtmilano 的回答 https://stackoverflow.com/a/4743398/103081:

问:我有一个简单的调试解决方案,它将内容写入 127.0.0.1:4444,我希望能够简单地从 bash 绑定端口并打印遇到的所有内容。是否有捷径可寻?

A:

$ 执行3/dev/tcp/127.0.0.1/4444

$ 猫

还可以从 bash 打开一个远程进程的套接字,即与守护进程通信:

From: TCP 连接,仅限 bash https://stackoverflow.com/questions/7765004/tcp-connection-bash-only

我们学习exec 5<>"/dev/tcp/${SERVER}/${PORT}"将 TCP 链接重定向到文件描述符 5 以进行输入和输出。

Not all bash程序是在 TCP 支持下编译的。它显然依赖于 Linux 发行版。至少根据评论关于这个答案 https://stackoverflow.com/a/7765082/103081 by 威廉·珀塞尔 https://stackoverflow.com/users/140750/william-pursell

除此之外还有其他的贝壳bash。许多 shell 是在 *nix 时代开发的。ksh科恩壳。cshC壳。伯恩外壳sh。灰壳。维基百科保留了一个贝壳列表 http://en.wikipedia.org/wiki/Comparison_of_command_shells。而且这些 shell 各有各的优缺点,并且彼此的格式并不完全兼容!

快进大约 30 年,现在常用的已经不多了。

但这里有一个重要的特征:每个用户可以选择自己的登录 shell。请参阅chsh http://linux.die.net/man/1/chsh命令。

所以我要去的地方是如果bash不支持您需要执行的通信,您可以设置一个命令外壳,可以在其中发送特殊消息而无需打开新进程。这可能会节省您几毫秒的时间,但通常不值得。但没有什么可以阻止你。您甚至可以设置一个 ipython 命令 shell,如中所建议的https://stackoverflow.com/a/209670/103081 https://stackoverflow.com/a/209670/103081,并且 python 可以导入与专用守护进程进行套接字通信所需的大部分内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向我的 Linux 守护程序应用程序发送消息的最简单方法是什么? 的相关文章

  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • npm package.json bin 无法在 Windows 上运行

    我正在尝试通过 package json 启动我的 cli 工具bin财产 我有以下内容 name mycli bin bin mycli 当我在包路径中打开 cmd 并输入 mycli 时 它表示该命令无法识别 我应该运行 npm 命令吗
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐