生產環境下,除我們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 ~]
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈