如何在 Linux 上设置守护程序? (linux 设置 守护程序)
Linux是一个流行的开源操作系统,被广泛应用于服务器环境中。作为服务器的操作系统,Linux需要稳定可靠地运行,而守护程序则是保证系统稳定的关键组成部分之一。守护程序可以在后台运行,定期执行一些任务或者等待某些事件发生,并对系统资源进行监控,以便在出现故障时能够快速相应。本文将讲解如何在Linux上设置守护程序。
一、什么是守护程序?
守护程序(daemon)是一种运行在后台的程序。在Linux系统中,守护程序通常运行在系统初始化时启动,并一直保持运行状态,直到系统关闭或者守护程序被手动关闭或者重新启动。
守护程序通常用于执行某些任务或者等待某些事件的发生。例如,一个邮件服务器的守护程序可以等待邮件的到达并将其存储在服务器上,一个Web服务器的守护程序可以等待客户端的请求并提供相应的服务。
二、如何创建守护程序?
在Linux系统中,我们可以使用系统提供的命令或者编写一些脚本来创建守护程序。一个基本的守护程序如下所示:
“`
#include
#include
#include
#include
#include
#include
#include
void daemonize(char *cmd)
{
int i, fd0, fd1, fd2;
pid_t pid;
struct sigaction sa;
// 1. Umask
umask(0);
// 2. Fork
if ((pid = fork())
exit(1);
} else if (pid != 0) { exit(0);
}
// 3. Setsid
setsid();
// 4. Signal handling
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGHUP, &sa, NULL)
exit(1);
}
if ((pid = fork())
exit(1);
} else if (pid != 0) { exit(0);
}
// 5. Change directory
if (chdir(“/”)
exit(1);
}
// 6. Close file descriptors
close(0);
fd0 = open(“/dev/null”, O_RDWR);
fd1 = dup(0);
fd2 = dup(0);
// 7. Open syslog
openlog(cmd, LOG_CONS, LOG_DAEMON);
if (fd0 != 0 || fd1 != 1 || fd2 != 2) { syslog(LOG_ERR, “unexpected file descriptors %d %d %d”, fd0, fd1, fd2);
exit(1);
}
}
int mn(int argc, char **argv)
{
daemonize(argv[0]);
while (1) {
// Do something in background
sleep(10);
}
exit(0);
}
“`
这是一个简单的C语言程序,实现了守护程序的基本功能。程序的主要逻辑如下:
1. 使用umask函数设置文件权限掩码为0,以免受到继承自父进程的文件权限掩码的影响。
2. 调用fork函数创建一个新进程,并使该新进程成为父进程的子进程。如果fork失败,则直接退出程序。如果是父进程,则直接退出程序。
3. 调用setsid函数创建一个新的会话,并使该新会话成为进程组组长会话。因为会话是一个进程组的,所以在调用setsid函数之前,必须先创建一个新进程,以免影响之前的进程组。
4. 忽略SIGHUP信号。这样,即使父进程退出,子进程也不会因为收到SIGHUP信号而退出。
5. 调用chdir函数将当前工作目录更改为根目录,以使当前工作目录不受其他进程或设备的影响。
6. 调用close函数依次关闭标准输入、标准输出、标准错误,并使用open函数将它们分别映射到/dev/null文件描述符上,以防止向终端输出。
7. 调用openlog函数打开系统日志,以便在系统日志中记录日志消息。
在程序的mn函数中,我们调用daemonize函数来创建守护进程,并在while循环中做一些后台任务。
三、如何将守护程序设置为开机启动?
一旦我们创建了一个守护进程,我们也希望系统在每次启动时自动启动它。在Linux系统中,我们可以通过将守护进程的启动脚本复制到/etc/init.d目录,然后使用update-rc.d命令将其添加到系统启动脚本中。例如,假设我们已经创建了一个名为mydaemon的守护进程,并将其启动脚本保存在/etc/init.d目录下,那么我们可以按照以下步骤将其设置为开机启动:
1. 复制启动脚本到/etc/init.d目录:
“`
sudo cp mydaemon /etc/init.d
“`
2. 使用update-rc.d命令将其添加到系统启动脚本中:
“`
sudo update-rc.d mydaemon defaults
“`
现在,守护进程已经设置为开机启动了。
四、如何管理守护程序?
当我们创建了一个守护进程后,我们可能需要监控它的运行状态、停止它的运行、重新启动它等。在Linux系统中,我们可以使用以下命令来管理守护进程:
1. 使用ps命令查看守护程序运行状态:
“`
ps aux | grep mydaemon
“`
这条命令将列出所有正在运行的mydaemon守护进程的信息。
2. 使用kill命令停止守护程序:
“`
sudo kill [pid]
“`
这条命令将停止指定pid的守护进程。
3. 使用service命令重新启动或停止守护程序:
“`
sudo service mydaemon restart
sudo service mydaemon stop
“`
这些命令将重新启动或停止mydaemon守护进程。
五、