在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果检测到任何更改,则应在启动控制台的路径上加上换行符。
我已经准备好更改代码的文件系统了,但是我不知道如何创建守护程序。
我的代码来自这里:http :
//www.yolinux.com/TUTORIALS/ForkExecProcesses.html
叉后该怎么办?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果将检测到任何更改,则应将路径写入启动它的控制台+换行符。
守护程序在后台工作,并且(通常…)不属于TTY,这就是为什么您无法以可能想要的方式使用stdout /
stderr的原因。通常,使用syslog守护程序( syslogd )将消息记录到文件中(调试,错误等)。
除此之外,还有一些 必需的步骤 来守护进程。
如果我没有记错的话,这些步骤是:
为您提供一个起点:查看显示基本步骤的此框架代码。现在,也可以在GitHub上分叉此代码:linux守护程序的基本框架
/*
* daemonize.c
* This example daemonizes a process, writes a few log messages,
* sleeps 20 seconds and terminates afterwards.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <syslog.h>
static void skeleton_daemon()
{
pid_t pid;
/* Fork off the parent process */
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0)
exit(EXIT_SUCCESS);
/* On success: The child process becomes session leader */
if (setsid() < 0)
exit(EXIT_FAILURE);
/* Catch, ignore and handle signals */
//TODO: Implement a working signal handler */
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
/* Fork off for the second time*/
pid = fork();
/* An error occurred */
if (pid < 0)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
if (pid > 0)
exit(EXIT_SUCCESS);
/* Set new file permissions */
umask(0);
/* Change the working directory to the root directory */
/* or another appropriated directory */
chdir("/");
/* Close all open file descriptors */
int x;
for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
{
close (x);
}
/* Open the log file */
openlog ("firstdaemon", LOG_PID, LOG_DAEMON);
}
int main()
{
skeleton_daemon();
while (1)
{
//TODO: Insert daemon code here.
syslog (LOG_NOTICE, "First daemon started.");
sleep (20);
break;
}
syslog (LOG_NOTICE, "First daemon terminated.");
closelog();
return EXIT_SUCCESS;
}
gcc -o firstdaemon daemonize.c
./firstdaemon
检查一切是否正常: ps -xj | grep firstdaemon
输出应与此类似:
您应该在这里看到的是:
该 PID!= SID ,这意味着我们的进程不是会话组长
(因为第二叉())
由于PID!= SID,我们的过程 无法再次控制TTY
读取系统日志:
/var/log/syslog
做一个: grep firstdaemon /var/log/syslog
输出应与此类似:
firstdaemon [3387]:第一个守护程序已启动。
firstdaemon [3387]:第一个守护程序终止。
注意: 实际上,您还需要实现信号处理程序并正确设置日志记录(文件,日志级别…)。
进一步阅读:
在Linux中,我想添加一个无法停止的守护进程,它监视文件系统的更改。如果检测到任何更改,它应该写入启动控制台的路径以及换行符。 我已经准备好了更改文件系统的代码,但是我不知道如何创建守护进程。 我的密码是:http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html 叉子用完后怎么办?
问题内容: 在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。 但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。 这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么? 问
问题内容: 创建可在Linux上使用“服务”运行的Java应用程序的最佳方法是什么?我打算使用此处提供的JSW ,但不能在此上使用许可证(许可证是GPL或据我所知要花钱)。我需要apache样式许可。 我正在使用maven进行构建,因此,如果可以使用maven插件创建服务,那就太好了,但是其他建议也都很棒。 我已经看过Apache Commons Daemon ,是否为此有一个Maven插件?文档
问题内容: 我正在编写Linux守护程序。我发现了两种方法。 通过调用和设置守护进程。 使用运行程序。 哪个是正确的方法? 问题答案: 来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16 以下是成为守护程序的步骤: 1. fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不
问题内容: 这里有人在Golang中编写了守护进程吗?你能指导我如何做吗?欢迎有用的链接。 问题答案: 是的,这已经完成。请参阅go-daemon项目。请注意,启动goroutine 后 在守护进程中发生某些问题。有关详细信息,请参见问题227。 目前,我建议您使用操作系统提供的实用程序。
问题内容: 在Ruby中创建行为良好的Unix或Linux守护程序的正确方法是什么? 无论如何,行为良好的守护程序的定义是什么,如何用Ruby编写这样的程序? 问题答案: 根据 UNIX环境 第13章的Stevens 高级编程 ,这是制作行为良好的Unix守护程序的过程: 分叉并有父出口。这使Shell或引导脚本认为命令已完成。此外,保证子进程不会成为进程组负责人(下一个setsid的先决条件)