【发布时间】:2025-12-26 12:50:11
【问题描述】:
我创建了一个将数据从源目录复制到目标目录的守护进程。
我将其命名为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;
【问题讨论】:
-
所以你基本上是在问,“一个程序如何在 Linux 下与另一个程序通信?”一些常用的方法是文件、命名管道、套接字、信号。例如,inetd 在收到 SIGHUP 时会重新读取其配置文件。
-
您很可能需要更多代码,但您不必将它放在单独的程序中。单个程序可以有一个带有
if args contain "-d" then call run_daemon(args) else call send_to_daemon(args)的主程序。问题是您需要编写run_daemon()和send_to_daemon()并决定协议的所有细节。 -
没关系。现在,如果您查看目录 /var/run,您可能会发现一些其他守护进程留下的 pid 文件。这些文件包含一个数字,即正在运行的守护程序的进程 ID 号。通过创建/读取/写入该文件,您的命令行进程可以知道守护进程的 pid,或者是否有一个正在运行。这就是命令行进程如何知道向哪个 pid 发送信号、让守护进程读取其配置文件或以其他方式检查其“收件箱”的方式。如果你想使用套接字,你必须使用像 select() 这样更难的异步调用。