Linux Guard Service - 进程分裂与脱离

进程分裂更名

void set_ps_name(char *name) {
    prctl(PR_SET_NAME, name);
}

修改进程长名称

  1. 备份进程环境变量空间

    for (i = 1; i < argc; i++) {
        argv_new[i] = strdup(argv[i]);
    }
    char **new_environ = malloc(env_len * sizeof(char *));
    
    if (environ) {
        unsigned int i = -1;
        while (environ[++i])
            new_environ[i] = strdup(environ[i]);
    }
  2. 写入进程长名称
    sprintf(argv[0], name);
  3. 还原进程环境变量
    //      for(i=1; i<argc; i++){
    //              sprintf(argv[i],argv_new[i]);
    //      }
    
    //      for(i=0; i<env_len;i++){
    //              sprintf(environ[i],new_environ[i]);
    //      }

进程杀死后自动恢复

  1. 等级子进程的PID

    void add_index(char **index, int i, pid_t pid) {
        index[i] = (char *) malloc(sizeof(char) * 10);
        sprintf(index[i], "%d", pid);
    }
  2. 每隔一秒检查一次所有进程,为已经死亡的进程重新分裂并登记
    char sub_name[50] = "/proc/0000000/cmdline";
    sprintf(sub_name, "/proc/%s/cmdline", pid);
    FILE *cmdline = fopen(sub_name, "r");
    if (!cmdline) {
        return 0;
    }
    --------------------------------------------
    if (pid == 0) {
        return i;
    } else {
        sprintf(index[i], "%d", pid);

父进程死亡后子进程自动结束

waitpid(-1, NULL, WNOHANG);

Service 的编写方法

[Unit]
Descryption=

[Service]
Type=forking
ExecStart=/usr/sbin/

[Install]
WantedBy=multi-user.target

Systemd 默认从目录

/etc/systemd/system/

读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录

/usr/lib/systemd/system/

真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

使用multi-user.target控制后,system enable自动向启动段注册该服务

结果

启动服务

root      19924      1  0 00:47 ?        00:00:00 ./test [main] 00:00:05
root      19925  19924  0 00:47 ?        00:00:00 ./test [sub-01] 00:00:19
root      19927  19924  0 00:47 ?        00:00:00 ./test [sub-02] 00:00:18
root      19928  19924  0 00:47 ?        00:00:00 ./test [sub-03] 00:00:17
root      19930  19924  0 00:47 ?        00:00:00 ./test [sub-04] 00:00:16
root      19931  19924  0 00:47 ?        00:00:00 ./test [sub-05] 00:00:15
root      19932  19924  0 00:47 ?        00:00:00 ./test [sub-06] 00:00:14
root      19934  19924  0 00:47 ?        00:00:00 ./test [sub-07] 00:00:13
root      19935  19924  0 00:47 ?        00:00:00 ./test [sub-08] 00:00:12
root      19936  19924  0 00:47 ?        00:00:00 ./test [sub-09] 00:00:11
root      19937  19924  0 00:47 ?        00:00:00 ./test [sub-10] 00:00:10
root      19938  19924  0 00:47 ?        00:00:00 ./test [sub-11] 00:00:09
root      19940  19924  0 00:47 ?        00:00:00 ./test [sub-12] 00:00:08
root      19941  19924  0 00:47 ?        00:00:00 ./test [sub-13] 00:00:07
root      19950   1090  0 00:47 ?        00:00:00 sleep 60
root      19951  19924  0 00:47 ?        00:00:00 ./test [sub-14] 00:00:06
root      19953  19924  0 00:47 ?        00:00:00 ./test [sub-15] 00:00:05

RPM打包树

./rpmbuild
|-BUILD
|-RPM
|-SOURCES
|-SPECS
|-SPRMS

RPM SPEC文件写法

tagname: value

支持宏 %define

%转义字符%%

定义包的名称

name:tair

版本号

version:1.0

build路径

buildroot: %{_tmppath}/%{name}-%{version}-root

指定源代码

source:tair-1.0.src.tar.gz

构建前

%prep
%setup -q

将切换到构建所在的目录,通常是/usr/src/redhat/BUILD,然后解压,以包名命名的子目录

构建

%build
...(构建指令)
make

安装

%install
make install PREFIX=$RPM_BUILD_ROOT/usr/local

清理

%clean
rm -rf $RPM_BUILD_ROOT

指定文件列表

%file
...

前缀和后缀段

%pre为安装前执行
%post为安装后执行
%preun为卸载前执行
%postun为卸载后执行

注意

%files段自动将环境切换至

$RPM_BUILD_ROOT

即使写为/usr/等绝对路径,rpmbuild时依然会视为相对路径

解决
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/

%install段是为%files段做准备用的,因此在环境切换之前,cp -a把所有文件拷贝到BUILDROOT中,因此%files段直接改写为/*,可以避免找不到路径的问题

结果

安装

检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/test-1552227-1.0-1.0.x86_64
写道:/root/rpmbuild/SRPMS/test-1552227-1.0-1.0.src.rpm
写道:/root/rpmbuild/RPMS/x86_64/test-1552227-1.0-1.0.x86_64.rpm
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.V0GhQK
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf /root/rpmbuild/BUILDROOT/test-1552227-1.0-1.0.x86_64
+ exit 0
cp /root/rpmbuild/RPMS/x86_64/*.rpm ./test-1552227.rpm
[[email protected] 1552227-000106]# rpm -ivh test-1552227.rpm
准备中...                             ################################# [100%]
准备安装test-1552227
正在升级/安装...
   1:test-1552227-1.0-1.0             ################################# [100%]
完成安装test-1552227
[[email protected] 1552227-000106]# 

卸载

[[email protected] 1552227-000106]# rpm -e test-1552227
准备卸载test-1552227
完成卸载test-1552227
[[email protected] 1552227-000106]# 

makefile编写方法

调用rpm

为rpm建立打包树,把文件压缩后放入SOURCES

mkdir -p $(RPM_SYS_PATH){BUILD,SOURCES,SPECS,SPRMS,RPMS}
tar -zcvf $(S_NAME).tar.gz $(S_NAME)
cp $(S_NAME).tar.gz $(RPM_SYS_PATH)SOURCES/

调用rpmbuild

rpmbuild -ba $(ME).spec

/usr/1552227文件夹非空时保留

rmdir /usr/1552227

rmdir不会删除非空文件夹

向文件写入学号姓名

echo "1552227刘天辰">1552227.dat

原文地址:https://www.cnblogs.com/liutianchen/p/8503542.html

时间: 2024-10-05 04:22:42

Linux Guard Service - 进程分裂与脱离的相关文章

Linux Guard Service - 守护进程再次分裂子进程

当系统区内存不能再申请新进程的时候申请会失败 在512MB内存下最多分配的子进程数 3331 [[email protected] 05]# ./test5-1 50000 expect 50000 sub process [[email protected] 05]# 1000 sub process attributed 1000 sub process attributed 1000 sub process attributed pid attribute failed! Total su

Linux Guard Service - 杀死守护进程

杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 \_ ./test4-1 14090 ? S 0:00 \_ ./test4-1 14091 ? S 0:00 \_ ./test4-1 14092 ? S 0:00 \_ ./test4-1 14093 ? S 0:00 \_ ./test4-1 14094 ? S 0:00 \_ ./test4

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

linux服务与进程

linux服务与进程 http://www.cnblogs.com/jamesbd/p/3567654.html linux服务与进程 1.应用程序 2.服务脚本 3.配置文件 4.查看进程 5.查看端口 6.crontab任务计划 需求:搭建一个web服务器,用apache软件,web服务能够随着计算机的启动而启动,而且对外提供web服务的端口是800端口,最后查看进程和端口? 1.安装apache的软件 yum -y install httpd* 2.设置随计算机启动而启动 chkconfi

在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service

在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service 1.在 /etc/rc.d/init.d/ 目录下创建一个名字和服务名完全相同的 shell 脚本文件 joyupx: vim joyupx /etc/rc.d/init.d/ 目录中存放的一般都是 shell 脚本文件,但是文件名不可以带后缀“.sh”: 服务名必须与其 /etc/rc.d/init.d/ 目录下关联的配置文件名称完全相同,否则报找不到这样的服务: 2.在 joyupx 文件中加入如下代码:

linux获取daemon进程的控制台数据

linux提供了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果.但是进程后台运行后,原本在终端控制台输出的数据就看不到了.那么,怎样才能找回这些数据? 这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起. daemon主要做两件事: 1.创建子进程,退出当前进程,并且以子进程创建新会话.这样,就算父进程退出,子进程也不会被关闭 2.将标准输入,标准输出,标准错误都重定向/dev/null daemon 实现大致如下: int daemon

linux 创建守护进程的相关知识

linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关知识,需要的朋友可以参考下 关键字:linux.守护进程 创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到

linux c 笔记 进程控制(二)---守护进程

守护进程(Daemon),一说精灵进程,是指在后台运行的,没有控制终端与之相连的程序.它独立于控制终端周期性地执行某种任务或等待处理某些发生的事件.它是一个生存期较长的进程,守护进程常常在系统引导装入时启动,在系统关闭时终止.Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond.打印进程lqd等(这里的结尾字母d就是Daemon的意思).由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的

linux的守护进程init.d和xinetd.d

Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有些书籍和资料也把守护进程称作: