我创建了一个将数据从源目录复制到目标目录的守护进程。
我将其命名为 cpd(复制守护进程)。它定期运行此 cp 命令:cp src dest
但是如果我需要改变这个cp命令执行的间隔,我应该如何与cpd守护进程通信呢?
例如:cpd -p 120 --> 其中-p表示句点,120以秒为单位。
PS:“我知道如何启动后台进程:创建一个子进程并退出父进程,
设置新 session ID,关闭继承的标准文件描述符,更改工作目录。创建守护进程的标准步骤。我还使用 syslog 在执行每个命令后记录状态消息。”
@保罗:
所以我需要一个像下面这样的配置文件。当我在没有 -d 选项的情况下运行时,我应该向守护进程发出信号以读取该文件并相应地更改其变量和行为。是吗?
# Example configuration file for cpd - An test Linux daemon.
# Comments start with a # and are ignored.
# Configuration options are delimited by = and ;
# Example:
# arg=val;
verbose_logging_enabled=true;
daemon_enabled=false;
config_file_path=/etc/cpd.conf;
source_path=/home/Documents/Source;
destination_path=/home/Documents/Destination;
最佳答案
这取决于您希望与正在运行的守护进程进行多少通信。
如果你想进行完整的对话,那么你将不得不考虑套接字、监听器和协议(protocol)等等。这是相当多的工作。
不过,您的要求听起来很简单。在这种情况下,传统的做法是让您的守护进程为 HUP 安装一个信号处理程序(请参阅 sigaction 或它在您的 unix 风格上的等效内容)。当程序接收到该信号时,处理程序只是重新读取配置文件(或者更确切地说,做一些导致守护进程以某种方式重新读取配置文件的操作)。因此顺序是:
% vi .../my-daemon.config
% kill -HUP <daemon-pid>
让守护进程在启动时将其 PID 写入 /var/run 中的文件是很常见的,因此第二行将是
% kill -HUP `cat /var/run/mydaemon.pid`
如果你想要花哨的自动化,那么你可以向守护进程添加一些选项,它会更改配置然后发送信号(参见 kill(2))。
还有一点是信号 USR1 和 USR2 是为这种通信而设计的。如果您为 HUP、USR1 和 USR2 安装信号处理程序,那么这就是您可以对守护程序进行管理的三种不同类型的 poke。这可能就是您所需要的。
关于linux - IPC通知一个进程改变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886811/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)