linux获取daemon进程的控制台数据
来源:互联网
时间:2026-02-26 11:58:29
作者:
系统大全为您提供
linux提供了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果。但是进程后台运行后,原本在终端控制台输出的数据就看不到了。那么,怎样才能找回这些数据? 这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起。 daemon主要做两件事: 1、创建子进程,退出当前进程,并且以子进程创建新会话。这样,就算父进程退出,子进程也不会被关闭 2、将标准输入,标准输出,标准错误都重定向/dev/null daemon 实现大致如下: int daemonize(int nochdir, int noclose) { int fd; switch (fork()) { case -1: return (-1); case 0: break; default: _exit(EXIT_SUCCESS); } if (setsid() == -1) return (-1); if (nochdir == 0) { if(chdir("/") != 0) { perror("chdir"); return (-1); } } if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) { if(dup2(fd, STDIN_FILENO) < 0) { perror("dup2 stdin"); return (-1); } if(dup2(fd, STDOUT_FILENO) < 0) { perror("dup2 stdout"); return (-1); } if(dup2(fd, STDERR_FILENO) < 0) { perror("dup2 stderr"); return (-1); } if (fd > STDERR_FILENO) { if(close(fd) < 0) { perror("close"); return (-1); } } } return (0); } 所以,想取回进程的控制台数据,只要将标准输出,标准错误重定向到指定文件,然后读取这个文件就好了。 文章这里写了个例子,简单演示下(这里通过kill信号完成进程通信,有点粗暴) 代码如下,保存为 daemon_example.c #include #include #include #include static int fd = -1; void sigroutine(int dunno) { switch (dunno) { case SIGUSR1: fprintf(stderr, "Get a signal -- SIGUSR1 "); if (fd != -1) close(fd); fd = open("/tmp/console_temp.log", O_RDWR|O_APPEND|O_CREAT, 0600); if (fd == -1) break; dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); break; case SIGUSR2: fprintf(stderr, "Get a signal -- SIGUSR2 "); if (fd != -1) close(fd); fd = open("/dev/null", O_RDWR, 0); if (fd == -1) break; dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); break; } return; } int main() { signal(SIGUSR1, sigroutine); signal(SIGUSR2, sigroutine); daemon(1,0); for (;;){ fprintf(stderr,"test ") ; // 不断打印test sleep(1); } return 0; } 然后,编译和执行这个程序: $ gcc -o daemon_example daemon_example.c $ chmod +x daemon_example $ ./daemon_example $ ps -ef| grep daemon_example root 11328 1 0 19:15 ? 00:00:00 ./daemon_example 如上,进程后台运行了,拿到pid 11328 接着,写个脚本测试这个程序, 保存为test.sh: #!/bin/bash pid=$1 ps -p $pid>/dev/null if [ ! $? -eq 0 ] ; then echo pid does not exist! exit 1 fi echo pid $pid trap "kill -usr2 $pid && exit 1" HUP INT QUIT TERM kill -usr1 $pid echo it works,please wait.. sleep 1 tail -f -n 0 /tmp/console_temp.log echo done! 执行这个脚本,结果如下: $ ./test.sh 11328 pid 11328 it works,please wait.. test test 然后,按ctrl+c 退出脚本,这时脚本会通知进程将标准输出和标准错误重定向到 /dev/null,继续后台运行。 这样,这个脚本就成了后台进程的调试工具了,需要后台数据的时候执行一下,不需要就关闭。当然,这只是一个示例,实际应用中要做改善,比如kill信号改成pipe或socket通讯,缓存文件要限制大小,或自动清除等。
经验总结:
以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。
本文来自系统大全https://www.herecours.com/d/file/efpub/2026/26-26/20260226114812567236
编辑推荐:
- linux获取daemon进程的控制台数据02-26
- 如何在Word 2013中创建邮件合并标签?02-26
- 如何在Word 2016中打印双面文档?02-26
- 如何在Word 2010文档中使用撤消和恢复?02-26
- Word文本和段落格式,提示和建议02-26
- 如何在Word 2013中创建收件人列表02-26
- 如何在Word 2010文档中编辑图像?02-26
- 如何在Word 2016中缩进段落02-26
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 如何在Word 2013中创建邮件合并标签?
如何在Word 2013中创建邮件合并标签?
26-02-26 - 如何在Word 2016中打印双面文档?
如何在Word 2016中打印双面文档?
26-02-26 - Word文本和段落格式,提示和建议
Word文本和段落格式,提示和建议
26-02-26 - 如何在Word 2013中创建收件人列表
如何在Word 2013中创建收件人列表
26-02-26 - 如何在Word 2010文档中编辑图像?
如何在Word 2010文档中编辑图像?
26-02-26 - 如何在Word 2016中缩进段落
如何在Word 2016中缩进段落
26-02-26 - 如何将命令按钮添加到Word 2007快速访问工具栏?
如何将命令按钮添加到Word 2007快速访问工具栏?
26-02-26 - 如何在Word 2013中使用节?
如何在Word 2013中使用节?
26-02-26 - 如何在Word 2016中使用图形?
如何在Word 2016中使用图形?
26-02-26 - 如何在Word 2013中设置页边距?
如何在Word 2013中设置页边距?
26-02-26
