如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程

如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程,第1张

可以分三步来做:

做两个简单的守护进程,并能正常运行

监控进程是否在运行

启动进程

综合起来就可以了,代码如下:

被监控进程thisisatest.c(来自):

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>者氏

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>

void init_daemon()

{

int pid

int i

pid=fork()

if(pid<0)    

    exit(1) //创建错误,退出

else if(pid>0) //父进程退出

    exit(0)

    

setsid()//使子进程成为组长

pid=fork()

if(pid>0)

    exit(0)//再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)    

    exit(1)

//关闭进程打开的文件句柄

for(i=0i<NOFILEi++)

    close(i)

chdir("/root/test") //改变目录

umask(0)//重设文件创建的掩码

return

}

void main()

{

    FILE *fp

    time_t t

    init_daemon()

    while(1)

    {

        sleep(60)//等待一分钟再写入

        fp=fopen("testfork2.log","a")

        if(fp>=0)

        {

 首搏散           time(&t)

     银历       fprintf(fp,"current time is:%s\n",asctime(localtime(&t))) //转换为本地时间输出

            fclose(fp)

        }

    }

    return

}

监控进程monitor.c:

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>

#include<sys/wait.h>

#include<fcntl.h>

#include<limits.h>

#define BUFSZ 150

void init_daemon()

{

int pid

int i

pid=fork()

if(pid<0)

    exit(1) //创建错误,退出

else if(pid>0) //父进程退出

    exit(0)

setsid()//使子进程成为组长

pid=fork()

if(pid>0)

    exit(0)//再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)

    exit(1)

//关闭进程打开的文件句柄

for(i=0i<NOFILEi++)

    close(i)

chdir("/root/test") //改变目录

umask(0)//重设文件创建的掩码

return

}

void err_quit(char *msg)

{

perror(msg)

exit(EXIT_FAILURE)

}

// 判断程序是否在运行

int does_service_work()

{

FILE* fp

int count

char buf[BUFSZ]

char command[150]

sprintf(command, "ps -ef | grep thisisatest | grep -v grep | wc -l" )

if((fp = popen(command,"r")) == NULL)

err_quit("popen")

if( (fgets(buf,BUFSZ,fp))!= NULL )

{

count = atoi(buf)

}

pclose(fp)

    return count

// exit(EXIT_SUCCESS)

}

void main()

{

    FILE *fp

    time_t t

    int count

    init_daemon()

    while(1)

    {

        sleep(10)//等待一分钟再写入

        fp=fopen("testfork3.log","a")

        if(fp>=0)

        {

            count = does_service_work()

            time(&t)

            if(count>0)

                fprintf(fp,"current time is:%s and the process exists, the count is %d\n",asctime(localtime(&t)), count) //转换为本地时间输出

            else

            {

                fprintf(fp,"current time is:%s and the process does not exist, restart it!\n",asctime(localtime(&t))) //转换为本地时间输出

                system("/home/user/daemon/thisisatest")//启动服务

            }

            fclose(fp)

        }

    }

    return

}

具体CMD命令:

cc thisisatest.c -o thisisatest

./thisisatest

cc monitor.c -o monitor

./monitor

tail -f testfork3.log   -- 查看日志

入口安全优化

ssh配置优化

修改之前,需要将/etc/ssh/sshd_config备份一个,比如/etc/ssh/sshd_config.old, 主要优化如下参数

Port 12011

PermitRootLogin no

UseDNS no

#防止ssh客户端超时铅带#

ClientAliveInterval 30

ClientAliveCountMax 99

GSSAuthentication no

主要目的更改ssh远程端口、禁用root远程登录(本地还是可以root登录的)、禁用dns、防止ssh超时、解决ssh慢,当然也可以启用密钥登录,这个根据公司需求。

注意:修改以后需重启ssh生效,另外需要iptables放行最新ssh端口。

iptables优化

原则:用到哪些放行哪些,不用的一律禁止。

举下简单的例子:敏感服务比如mysql这种3306控制,默认禁止远程,确实有必要可以放行自己指定IP连接或者通过vpn拨号做跳板连接,不可直接放置于公网; 如单位有自己的公网IP或固定IP,那只允许自己的公网IP进行连接ssh或者指定服务端口就更好了。

用户权限以及系统安全优化

非root用户添加以及sudo权限控制

用户配置文件锁定

服务控制

默认无关服务都禁止运行并chkconfig xxx off,只保留有用服务。这种如果是云计算厂商提供的,一般都是优化过。如果是自己安装的虚拟机或纤激告者托管的机器,那就需要优化下,默认只保留network、sshd、iptables、crond、以及rsyslog等必要服务,一些无关紧要的服务就可以off掉了,

内核参数优化

进程级文件以及系统级文件句柄数量参数优化

默认ulinit -n看到的是1024,这种如果系统文件开销量非常大,那么就会遇到各种报错比如:

localhost kernel: VFS: file-max limit 65535 reached 或者too many open files 等等,那就是文件句柄打开数量已经超过系统限制,就需要优化了。

这个参数我们进程级优化文件如下:

vim /etc/security/limits.conf

# End of file

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

好了,退出当前终端以后重新登录可以看到ulimit -n已经改成了65535。另外需要注意,进程级参数优化还需要修改文件:

/etc/security/limits.d/90-nproc.conf 这个会影响到参数。查看某一个进程的limits可以通毁明过cat /proc/pid/limits查看。默认这个文件参数推荐设置:

[root@21yunwei 9001]# cat    /etc/security/limits.d/90-nproc.conf

*          soft    nproc     65535

root       soft    nproc     unlimited

系统级文件句柄优化

修改/etc/sysctl.conf添加如下参数:

fs.file-max=65535

内核参数优化(这个是非常重要的)。具体优化的文件为/etc/sysctl.conf,后尾追加优化参数:

net.ipv4.neigh.default.gc_stale_time=120

net.ipv4.conf.all.rp_filter=0

net.ipv4.conf.default.rp_filter=0

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.all.arp_announce=2

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.conf.lo.arp_announce=2

net.ipv4.tcp_synack_retries = 2

#参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1

#表示在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_max_syn_backlog = 262144

#这个参数表示TCP三次握手建立阶段接受SYN请求列队的最大长度,默认1024,将其设置的大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的链接请求。

设置完以后执行命令sysctl -p使得配置新配置的内核参数生效。系统优化这个内核对系统本身安全以及高并发都非常的有效(可以解决大量TIME_WAIT带来的无法访问使用、系统文件句柄数量超出等等)。

net.ipv4.tcp_timestamps = 1  #开启时间戳,配合tcp复用。如遇到局域网内的其他机器由于时间戳不同导致无法连接服务器,有可能是这个参数导致。注:阿里的slb会清理掉tcp_timestamps

net.ipv4.tcp_tw_recycle = 1 #这个参数用于设置启用timewait快速回收

net.ipv4.tcp_max_tw_buckets = 6000 #参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 1 #当服务器主动关闭链接时,选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。

net.ipv4.tcp_keepalive_time = 600 #当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。

net.ipv4.ip_local_port_range = 1024 65000#定义UDP和TCP链接的本地端口的取值范围。

fs.file-max=65535  #表示最大可以打开的句柄数;

设置完以后执行命令sysctl -p使得配置新配置的内核参数生效。这个内核对系统本身安全以及高并发都非常的有效(可以解决大量TIME_WAIT带来的无法访问使用、系统文件句柄数量超出等等)。

第一首先打开电脑的Linux系统。

再检查cron工具情况。

请点击输入图片描述

第二然后开启crond服务。

再检查服务开启状态。

请点击输入唯哗图片描述

第三然后检查mkdir的完整命令路径。

再配置/etc/crontab文件。

请点击输入图片描述

第四然后配置cron的信息。

再设置计划任务为每小时的34分钟创建一个jiaping文件。

请点信余击输入图片描述

请点击输入图片描述

第五然后保存/etc/crontab文件的修改。

再重新启动crond服务,文滑山滚件的内容生效。

请点击输入图片描述

第六然后查看当前的时间。

再查看根目录,检查jiaping文件的创建情况。

请点击输入图片描述

请点击输入图片描述


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8176407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存