我创建了一个守护程序,用于将数据从源目录复制到目标目录。
我已将其命名为cpd
(复制守护程序)。它会定期运行此cp
命令:cp src dest
但是如果我需要更改此cp
命令执行的间隔,我应该如何与cpd
守护进程通信?
例如:cpd -p 120
- >其中-p
表示句点,120
表示秒数。
PS:"我知道如何启动后台进程:创建子进程并退出父进程,
设置新的会话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;
答案 0 :(得分:4)
这取决于您希望与正在运行的守护程序进行通信的程度。
如果你想进行一次完整的对话,那么你将不得不考虑套接字和监听器以及协议。这是相当多的工作。
但您的要求听起来很简单。在这种情况下,传统的做法是让您的守护进程为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
安装信号处理程序,那么您可以管理守护程序的三种不同类型的戳。这可能就是你所需要的一切。
答案 1 :(得分:1)
您可以让您的进程侦听SIGUSR1和SIGUSR2(用户定义的信号)。在SIGUSR1上,它将复制间隔增加一些预定义的值,而在SIGUSR2上,它会减少它。你很容易做到这一点:
//call at startup
signal(SIGUSR1, SIGUSR1Handler);
signal(SIGUSR2, SIGUSR2Handler);
//handlers:
void SIGUSR1Handler(int sig)
{
//increment copy interval
//maybe print a message with the new value
}
void SIGUSR2Handler(int sig)
{
//increment copy interval
//maybe print a message with the new value
}
这与其他人已经提到的如何与您的守护进程进行通信的方式没有什么不同,但增加了不需要任何外部配置的实用方面。
答案 2 :(得分:0)
如果您的守护进程大部分时间都无所事事,为什么不让它进行'阻塞'读取()?即只是等到文件填满命令然后读取它。命令行可以是写入命令文件的脚本。