什么情况下用daemon进程
生产环境下,除了我们ssh登录上去,然后手动跑的那部分以外,其他都是自动运行的,这些大部分都应该是后台执行的。如何才能后台执行呢?
- nohup ./XXX &
- 由系统的其他daemon进程启动。这样的话,你的程序是它的子进程,跟终端没关系。退出终端也不会导致进程退出。如写在crontab里。
- 写成daemon程序,可以手动执行,退出终端时程序不退出。
如何选择呢?
(1)首先,清理过期日志这一类需求,可以写一个死循环一直运行,也可以写在crontab里,每次执行完就退出(如果每分钟一次可以满足的话);
(2)crontab的需要接受最多1分钟的时延,如果实时性要求更高一些,那么就需要考虑写个死循环了,这个程序可以由crontab来start和restart,只有在挂了重启时才会出现1分钟时延;
(3)服务不能中断的(nginx、redis、apache,所有在线服务),一般都是daemon程序。但理论上用(2)似乎也可以;当然这两者细节上有很多区别。
怎么用daemon进程
linux C/C++可以直接调用int daemon(int, int)函数,不需要自己重新实现。
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: $0 no_ch_dir no_close_fd\n");
exit(0);
}
int no_ch_dir = atoi(argv[1]);
int no_close_fd = atoi(argv[2]);
std::cout << "main pid : " << getpid() << std::endl;
std::cout << "main parent pid : " << getppid() << std::endl;
std::cout << "main pwd : " << get_current_dir_name() << std::endl;
if (daemon(no_ch_dir, no_close_fd) != 0) {
// 一般都用daemon(0,0)
// 成功返回0,失败返回-1
// daemon(0,0):chdir到/,关闭0,1,2描述符。
std::cout << "stdout: daemon = -1" << std::endl;
std::cerr << "stderr: daemon = -1" << std::endl;
return 1;
}
std::cout << "stdout: daemon = 0" << std::endl;
std::cerr << "stderr: daemon = 0" << std::endl;
std::cout << "sub pid : " << getpid() << std::endl;
std::cout << "sub parent pid : " << getppid() << std::endl;
std::cout << "sub pwd : " << get_current_dir_name() << std::endl;
while (1);
return 0;
}```
编译运行:
[chenming@localhost ~] g++test1.cc−otest1[chenm