linux获取后台进程的控制台数据
那么,如何才干找回这些数据?
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);
}
#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
$ ps -ef| grep daemon_example
root 11328 1 0 19:15 ?
00:00:00 ./daemon_example
如上,进程后台执行了。拿到pid 11328
#!/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
当然,这仅仅是一个演示样例。实际应用中要做改善。比方kill信号改成pipe或socket通讯,缓存文件要大小限制。或自己主动清除等。
linux获取后台进程的控制台数据相关推荐
- linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?
您可以使用IP_PKTINFO将数据包被发送到组播组的地址 - 即使套接字认购一堆组播组.完成此操作后,您将按顺序获取数据包并按组地址进行过滤.看下面的例子: #include #include #i ...
- 使用纯 python 实现 Instruments 协议,跨平台 (win,mac,linux) 获取 iOS 性能数据
原文由YueChen发表于TesterHome社区网站,点击原文链接可与YueChen交流. 前言 获取 iOS 性能数据,一直都是比较麻烦的事情,之前在构建测试框架&平台的时候,获取 iOS ...
- linux的常用备份方法,Linux系统下常用的数据备份方法
Linux系统下常用的数据备份方法 发布时间:2009-10-28 15:11:36来源:红联作者:szlfeng Linux系统下常用的数据备份方法 1.本机上数据的手工备份 Linux系统上配有功 ...
- Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)...
一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...
- Linux 获取设备树源文件(DTS)里描述的资源
Linux 获取设备树源文件(DTS)里的资源 韩大卫@吉林师范大学 在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 plat ...
- linux获取java环境变量的值,linux获取java环境变量的值
linux获取java环境变量的值 [2021-02-11 00:17:01] 简介: 服务器 这篇文章主要为大家展示了linux环境下怎么配置环境变量,内容简而易懂,希望大家可以学习一下,学习完之 ...
- Linux 如何取进程运行时间,linux -- 获取进程执行时间
获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...
- linux中mongo的导出数据,Linux下mongodb安装及数据导入导出教程(示例代码)
Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1 ...
- pixhawk/px4如何获取及使用传感器数据
pixhawk/px4如何获取及使用传感器数据 第一步:读取传感器数据 上一篇博文已经介绍了如何给pixhawk/px4创建一个应用程序,现在我们在上一个应用程序的基础上使用传感器数据. 应用程序为了 ...
最新文章
- [分享] 关于App Store下载到一半发生错误的问题 [复制链接]
- vagrant安装及使用方法
- java中的排序算法——简单选择排序,树形选择排序与堆排序(一)
- leetcode409.Longest Palindrome
- 《系统集成项目管理工程师》必背100个知识点-99云计算
- 2021第三封拒信来自哈佛大学计算机科学与技术专业~
- node 微信开发 json转xml 格式
- iap如何初始化_IAP在线升级模块详细设计说明
- tensorflow中的sequence_loss_by_example
- 【Alpha】第八次Scrum meeting
- 程序员:如何成为一个全栈的工程师? 1
- vxe-table renderer 渲染器详解,render 渲染器使用方式
- bootstrap-select学习基础示例
- 阿里云算力的十年更迭史,重点都在这了!
- android盒子共享,Android使用SMB协议共享电脑内文件方法
- 传感器之热释电红外传感器
- 嵌入式Linux(十三)RTC实时时钟
- Linux安装PHP
- 2022年第三次面试,含泪整理万字面试题。
- Ajax提交Form表单的两种简单方式