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 <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>static int fd = -1;void sigroutine(int dunno) {switch (dunno) {case SIGUSR1:fprintf(stderr, "Get a signal -- SIGUSR1 \n");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 \n");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 \n") ; // 不断打印testsleep(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/bashpid=$1
ps -p $pid>/dev/null
if [ ! $? -eq 0 ] ; thenecho 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通讯,缓存文件要大小限制。或自己主动清除等。

文章最后。是不是有点取巧。你有什么更好的办法,欢迎评论交流!
參考:
[1] linux获取daemon进程的控制台数据 没有开花的树

linux获取后台进程的控制台数据相关推荐

  1. linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?

    您可以使用IP_PKTINFO将数据包被发送到组播组的地址 - 即使套接字认购一堆组播组.完成此操作后,您将按顺序获取数据包并按组地址进行过滤.看下面的例子: #include #include #i ...

  2. 使用纯 python 实现 Instruments 协议,跨平台 (win,mac,linux) 获取 iOS 性能数据

    原文由YueChen发表于TesterHome社区网站,点击原文链接可与YueChen交流. 前言 获取 iOS 性能数据,一直都是比较麻烦的事情,之前在构建测试框架&平台的时候,获取 iOS ...

  3. linux的常用备份方法,Linux系统下常用的数据备份方法

    Linux系统下常用的数据备份方法 发布时间:2009-10-28 15:11:36来源:红联作者:szlfeng Linux系统下常用的数据备份方法 1.本机上数据的手工备份 Linux系统上配有功 ...

  4. Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)...

    一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...

  5. Linux 获取设备树源文件(DTS)里描述的资源

    Linux 获取设备树源文件(DTS)里的资源 韩大卫@吉林师范大学 在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 plat ...

  6. linux获取java环境变量的值,linux获取java环境变量的值

    linux获取java环境变量的值 [2021-02-11 00:17:01]  简介: 服务器 这篇文章主要为大家展示了linux环境下怎么配置环境变量,内容简而易懂,希望大家可以学习一下,学习完之 ...

  7. Linux 如何取进程运行时间,linux -- 获取进程执行时间

    获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...

  8. linux中mongo的导出数据,Linux下mongodb安装及数据导入导出教程(示例代码)

    Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...

  9. pixhawk/px4如何获取及使用传感器数据

    pixhawk/px4如何获取及使用传感器数据 第一步:读取传感器数据 上一篇博文已经介绍了如何给pixhawk/px4创建一个应用程序,现在我们在上一个应用程序的基础上使用传感器数据. 应用程序为了 ...

最新文章

  1. [分享] 关于App Store下载到一半发生错误的问题 [复制链接]
  2. vagrant安装及使用方法
  3. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)
  4. leetcode409.Longest Palindrome
  5. 《系统集成项目管理工程师》必背100个知识点-99云计算
  6. 2021第三封拒信来自哈佛大学计算机科学与技术专业~
  7. node 微信开发 json转xml 格式
  8. iap如何初始化_IAP在线升级模块详细设计说明
  9. tensorflow中的sequence_loss_by_example
  10. 【Alpha】第八次Scrum meeting
  11. 程序员:如何成为一个全栈的工程师? 1
  12. vxe-table renderer 渲染器详解,render 渲染器使用方式
  13. bootstrap-select学习基础示例
  14. 阿里云算力的十年更迭史,重点都在这了!
  15. android盒子共享,Android使用SMB协议共享电脑内文件方法
  16. 传感器之热释电红外传感器
  17. 嵌入式Linux(十三)RTC实时时钟
  18. Linux安装PHP
  19. 2022年第三次面试,含泪整理万字面试题。
  20. Ajax提交Form表单的两种简单方式

热门文章

  1. [原创]使用ajaxFileUpload.js上传文件时附带额外参数。
  2. oracle数据库----SQL语句的实践(应用实例)
  3. SQL Server索引设计 第五篇
  4. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
  5. MySQL 误操作恢复表
  6. P1339 热浪 最短路径模板题
  7. PHP运算符与表达式
  8. AndroidStudio 解决Android方法数超过65535的问题
  9. SDWebImage
  10. JQuery:JQuery捕获HTML