ubuntu下编写开机自启守护进程,并记录进程信息到日志文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

步骤1:编写守护进程

void init(){
 pid_t pid;
 int i;
 pid=fork();        //创建第一子进程
 if(pid<0) exit(1);//创建失败退出
 if(pid>0) exit(0);//父进程退出
 setsid();         //第一子进程成为领头进程,脱离终端
 pid=fork();   //第一子进程生成第二子进程
 if(pid<0) exit(1);//创建失败退出
 if(pid>0) exit(0);//第一子进程退出
 chdir("/home/ling/文档");//切换目录
 umask(0);               //改变文件创建掩码
 for(i=0;i<NOFILE;i++)  //关闭文件流
  close(i);  
}

注意这里chdir函数中的路径就是日志文件的保存路径。

步骤2:记录进程信息到日志文件

void main(){
char buf[256];
FILE *fp,*p;
init();
while(1){
    sleep(30);                                           //每30s记录一次
    if((fp=fopen(“test.log”,“a”))>=0){                   //打开文件test.log,参数a表示以追加的形式打开
        p=popen(“ps-eopid,user,cmd,start_time,etime”,“r”);//将指针p连接到ps命令的标准输出
        while(fgets(buf,sizeof(buf),p)!=0)                 //获取输出内容并保存在buf中
            fprintf(fp,“%s\n”,buf);                        //以字符串的形式将buf中的内容写到fp指定的文件中
        pclose(p);
    }
    fclose(fp);
    }
}

步骤3:编译运行,设置开机启动

编译程序

命令行下执行:

gccprotect.c –o protect

到可执行文件protect,再执行:

./protect

可运行程序

机启动

安装sysv-rc-conf

sudo apt-get installsysv-rc-conf

执行:

sudosysv-rc-conf 这里是你的程序名称 on

到这里就可以的,但重启之后你在终端会找不到这个程序的信息,但它其实在后台运行。

设置开机启动的另一种方法就是直接把启动命令写到/etc/rc.local文件里面。

 


 



 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
NoSQL Ubuntu Redis
Ubuntu开机自启redis
本文介绍了如何在Ubuntu系统中通过创建systemd服务单元文件、重新加载systemd配置、启用服务和启动服务的步骤来实现Redis的开机自启动。
48 1
|
2月前
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
477 10
|
30天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
17 0
|
2月前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
22 3
|
2月前
|
缓存 运维 NoSQL
使用 psutil 获取硬件、网络以及进程信息
使用 psutil 获取硬件、网络以及进程信息
45 0
|
2月前
|
NoSQL
gdb中获取进程收到的最近一个信号的信息
gdb中获取进程收到的最近一个信号的信息
|
3月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
3月前
|
NoSQL Redis
Redis AOFRW主进程问题之更新manifest文件如何解决
Redis AOFRW主进程问题之更新manifest文件如何解决
|
3月前
|
消息中间件 JSON 自然语言处理
Python多进程日志以及分布式日志的实现方式
python日志模块logging支持多线程,但是在多进程下写入日志文件容易出现下面的问题: PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。 也就是日志文件被占用的情况,原因是多个进程的文件handler对日志文件进行操作产生的。
|
3月前
|
NoSQL 分布式数据库 Redis
Redis 进程问题之主进程更新manifest文件如何解决
Redis 进程问题之主进程更新manifest文件如何解决