问题标签 [daemon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?
并感谢您查看问题。
背景
我有几台机器在很短的时间内连续生成多个(最多 300 个)PHP 控制台脚本。这些脚本快速运行(不到一秒)然后退出。所有这些脚本都需要对大型trie结构进行只读访问,每次每个脚本运行时将其加载到内存中的成本都非常高。服务器运行 Linux。
我的解决方案
创建一个 C 守护程序,将 trie 结构保存在内存中并接收来自 PHP 客户端的请求。它将接收来自每个 PHP 客户端的请求,对内存结构执行查找并以答案进行响应,从而使 PHP 脚本免于执行该工作。请求和响应都是短字符串(不超过 20 个字符)
我的问题
我对 C 守护进程和进程间通信非常陌生。经过大量研究,我将选择范围缩小到消息队列和 Unix 域套接字。消息队列似乎足够了,因为我认为(我可能错了)它们将所有请求排队等待守护程序以串行方式回答它们。不过,Unix 域套接字似乎更易于使用。但是,我有各种问题无法找到答案:
- PHP 脚本如何发送和接收消息或使用 UNIX 套接字与守护程序通信?相反,C 守护进程如何跟踪它必须向哪个 PHP 进程发送回复?
- 我见过的大多数守护进程的例子都使用了一个无限的while循环,里面有一个睡眠条件。我的守护进程需要为随时可能出现的许多连接提供服务,并且响应延迟至关重要。如果 PHP 脚本在休眠时发送请求,守护程序将如何反应?我已阅读有关 poll 和 epoll 的信息,这是等待收到消息的正确方法吗?
- 每个 PHP 进程总是会发送一个请求,然后等待接收响应。我需要确保如果守护程序关闭/不可用,PHP 进程将等待响应设置的最长时间,如果没有收到响应,将继续进行而不是挂起。这可以做到吗?
数据结构的实际查找非常快,我不需要任何复杂的多线程或类似的解决方案,因为我相信以 FIFO 方式处理请求就足够了。我还需要保持简单愚蠢,因为这是一项关键任务服务,而且我对这种类型的程序相当陌生。(我知道,但我真的无路可走,学习体验会很棒)
我真的很感激能对我遇到的具体问题有所启发的代码片段。也欢迎链接到指南和指针,以进一步了解这个低级 IPC 的阴暗世界。
谢谢你的帮助!
更新
现在比我问这个问题时知道的要多得多,我只是想向任何感兴趣的人指出,Thrift框架和ZeroMQ在抽象出困难的套接字级编程方面做得非常出色。Thrift 甚至免费为您提供服务器的脚手架!
事实上,与其费力地构建网络服务器,不如考虑使用已经为您解决问题的优秀异步服务器编写应用程序服务器代码。当然,使用异步 IO 的服务器非常适合不需要密集 CPU 处理(或者事件循环阻塞)的网络应用程序。
python 的示例:Twisted,gevent。我更喜欢 gevent,并且我不包括 tornado,因为它专注于 HTTP 服务器端。
Ruby 示例:EventMachine
当然,Node.js基本上是当今异步服务器的默认选择。
ruby-on-rails - 加载 Ruby on Rails 模型而不加载整个框架
我正在寻找创建一个自定义守护程序,它将运行各种数据库任务,例如延迟邮件和用户通知(每个通知都是通知表中的单独行)。我不想使用script/runner
或rake
执行这些任务,因为某些任务可能只需要创建一两个数据库行或数千行,具体取决于任务。我不希望启动 ruby 进程或为每个操作加载整个 rails 框架的开销。我计划将这个守护进程全时保留在内存中。
为了创建这个守护进程,我想使用我的 ruby on rails 应用程序中的模型。我有许多 Rails 插件,acts_as_tree
如果AASM
我在哪里使用模型,我需要加载它们。我需要加载的一些插件是我创建的 ActiveRecord::Base 上的自定义 hack。(如果他们需要来自 rails 其他部分的组件,我愿意接受删除或重新编码一些插件。)
我的问题是
- 这是一个好主意吗?
- 并且 - 这是否可能以一种不需要我手动将每个文件包含在我的模型和插件中的方式来完成?
如果不是个好主意
- 什么是好的选择?
(我不反对编写自己的 SQL 查询,但我必须为守护进程添加数据库约束和单独的用户,以防止任何愚蠢的事故。鉴于我不熟悉配置数据库,我想使用活动记录作为拐杖。)
php - 认真加速PHP?
我已经写 PHP 很多年了,并且使用过所有的框架,但有一件事一直困扰着我……那就是每次有人告诉我的服务器他们想要页面服务。
我已经尝试过缓存、FastCGI、Zend Job Queue(和类似的 symfony 插件——以及我自己的基于 DB 的解决方案,它实现了 System_Daemon 类来运行后台进程),并且我已经设法让我的使用所有这些东西的应用程序相当快......但我无法克服我的设置文件,系统/环境检查功能以及所有应该只真正加载一次的东西......每次都加载某人点击我的页面。
所以,我的闲逛导致了以下问题——
是否有一些方法/技术可以将 PHP 的某些方面加载到 RAM 中,以便在请求该页面时,我的所有 settings.yml 文件、系统检查、框架文件、缓存页面等都可以直接从内存中加载,甚至无需触摸 HD ...或者需要每天通过相同的加载机制 50,000 次来启动程序?
如果 PHP 中什么都没有……是否有任何其他“网络”语言可以以这种方式编译,以允许真正的 init-once 应用程序?
java - 用 Java 位置编写的 Linux 守护进程
我目前正在编写一个 Java 守护程序。我正在编写一个包含标准守护程序命令(启动、停止、重新启动、状态)的脚本,并且我正在尝试决定安装守护程序时应该去哪里。
我目前的想法是:
PID 文件: /var/run/myapp.pid
守护程序脚本: /etc/init.d/myapp
Java 应用程序(.jar): /usr/bin/myapp
日志: /var/log/myapp.err , /var/log/myapp.log , /var/log/myapp.info(你明白了)
配置: /etc/myapp.conf(或/etc/myapp/configs-go-here如果我有多个在将来)
我还是 Linux 目录结构的新手,所以如果我做错了什么,请告诉我。最让我困惑的是我的 Java 应用程序是一个 .jar 文件(存档)而不是二进制文件。那么这是否意味着/usr/bin/不是它的“正确”位置?
java - 当我使用 Reference 类时会发生什么以及多少开销?
我看到每当我们使用任何引用类创建引用对象时都会运行一个守护线程
如果我们有分层线程结构,那么在每个级别都会启动一个额外的守护线程。
objective-c - 在目标c中编写守护进程
我需要编写一个守护进程,就像使用objective c 在os x 上的windows 服务一样。谁能指出一些样本?或指导我如何做到这一点?
macos - 在目标c中编写守护进程
我需要编写一个守护进程,就像使用objective c 在os x 上的windows 服务一样。谁能指出一些样本?或指导我如何做到这一点?
python - 检查是否使用python按下了键(后台守护程序)
我创建了一个 python 脚本,每次按下键盘上的 Super(或 WinKey)时都需要执行一个事件。
如果没有“聚焦”python进程,如何实现这一点——因为它在后台运行,等待按下键来执行事件?
我在网上看到很多帖子向我展示了如何阅读输入 - 但他们都需要一个让过程“集中”的帖子,没有人告诉我如何使用 python 脚本捕获 Super(或 WinKey)。
我正在运行 Ubuntu 9.10。
java - Java daemon - 处理关闭请求
我目前正在开发一个守护进程,它将执行很多不同的任务。它是多线程的,并且正在构建以处理几乎任何类型的内部错误而不会崩溃。好吧,我正在处理关闭请求,但我不确定我应该如何去做。
我有一个关闭挂钩设置,当它被调用时,它会设置一个变量,告诉主守护程序循环停止运行。问题是,这个守护进程产生了多个线程,它们可能需要很长时间。例如,这些线程之一可能正在转换文档。他们中的大多数会很快(我猜不到 10 秒),但会有一些线程可以持续长达 10 分钟以上。
我现在正在考虑做的是,当发送关闭挂钩时,在 ThreadGroup.activeCount() 上循环 5 秒左右,睡眠时间为 500 毫秒(左右)(所有这些线程都在 ThreadGroup 中)和之前在这个循环中,我将向所有线程发送通知,告诉它们已调用关闭请求。然后,无论他们在做什么清理和关闭,他们都必须立即进行。
还有人有什么建议吗?我对像 MySQL 这样的守护进程在被告知停止时会做什么感兴趣,它会立即停止。如果正在调用 10 个运行速度非常慢的查询,会发生什么情况?它是等待还是只是结束它们。我的意思是服务器真的很快,所以真的没有任何类型的操作我不应该在不到一秒的时间内完成。现在你可以在 1000 毫秒内做很多事情。
谢谢
unix - 如何在 MacOS 上加载系统范围的守护进程
我正在尝试使用此命令加载我的守护程序应用程序launchctl load /Library/LaunchDaemons/myPlistFileName
它工作正常,但仅当我的用户登录系统时。
我如何加载我的守护程序应用程序,它会在没有任何用户登录系统的情况下保持加载(如 Windows 服务)?
该命令sudo launchctl load /Library/LaunchDaemons/myPlistFileName
给我一个错误 - >没有找到加载
哪种方法是正确的?
编辑:我的 Plist 文件
目前是这样:在系统启动时,我的守护程序以 root 权限启动。在我使用我的用户帐户登录后,守护进程重新启动,我的用户是该进程的新所有者