生产环境下,除我们ssh登录上去,然后手动跑的那部份之外,其他都是自动运行的,这些大部份都应当是后台履行的。如何才能后台履行呢?
如何选择呢?
(1)首先,清算过期日志这1类需求,可以写1个死循环1直运行,也能够写在crontab里,每次履行完就退出(如果每分钟1次可以满足的话);
(2)crontab的需要接受最多1分钟的时延,如果实时性要求更高1些,那末就需要斟酌写个死循环了,这个程序可以由crontab来start和restart,只有在挂了重启时才会出现1分钟时延;
(3)服务不能中断的(nginx、redis、apache,所有在线服务),1般都是daemon程序。但理论上用(2)仿佛也能够;固然这二者细节上有很多区分。
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
");
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) {
// 1般都用daemon(0,0)
// 成功返回0,失败返回⑴
// daemon(0,0):chdir到/,关闭0,1,2描写符。
std::cout << "stdout: daemon = ⑴" << std::endl;
std::cerr << "stderr: daemon = ⑴" << 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 ~]
Usage:
main pid : 7896
main parent pid : 7573
main pwd : /home/chenming
[chenming@localhost ~]