进程分裂更名

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
[root@localhost 1552227-000106]# rpm -ivh test-1552227.rpm
准备中... ################################# [100%]
准备安装test-1552227
正在升级/安装...
1:test-1552227-1.0-1.0 ################################# [100%]
完成安装test-1552227
[root@localhost 1552227-000106]#

卸载

[root@localhost 1552227-000106]# rpm -e test-1552227
准备卸载test-1552227
完成卸载test-1552227
[root@localhost 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

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

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

    当系统区内存不能再申请新进程的时候申请会失败 在512MB内存下最多分配的子进程数 3331 [root@localhost 05]# ./test5-1 50000 expect 50000 sub ...

  2. Linux Guard Service - 守护进程分裂

    分裂守护进程 由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质 int i = 0; for (i = 0; i < 10; i++) { // sleep(1); ...

  3. Linux Guard Service - 杀死守护进程

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

  4. Linux Guard Service - 守护进程的作用、用途、父进程标识的特点

    让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...

  5. Linux Guard Service - 前台进程和后台进程切换

    把一个正在执行的程序放入后台 [root@localhost 01]# Ctrl+Z 此使程序被移动到后台,但不能继续输出(处于暂停态) [root@localhost 01]# ./test1-1 ...

  6. python实现Linux启动守护进程

    python实现Linux启动守护进程 DaemonClass.py代码: #/usr/bin/env python # -*- coding: utf-8 -*- import sys import ...

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

    在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service 1.在 /etc/rc.d/init.d/ 目录下创建一个名字和服务名完全相同的 shell 脚本文件 joyup ...

  8. Linux如何查看进程、杀死进程、启动进程等常用命令

    Linux如何查看进程.杀死进程.启动进程等常用命令 关键字: linux 查进程.杀进程.起进程1.查进程    ps命令查找与进程相关的PID号:    ps a 显示现行终端机下的所有程序,包括 ...

  9. 时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell

    时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell opensuse 一些常用命令:    service xxx start/s ...

随机推荐

  1. Java 迭代器 Iterator

    迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行 ...

  2. 汇编_指令_REP MOVESB 和 CLD

    先说说MOVSB(MOVe String Byte):即字符串传送指令,这条指令按字节传送数据.通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI ...

  3. Call to your teacher

    链接:https://www.nowcoder.net/acm/contest/76/F来源:牛客网 Call to your teacher 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/ ...

  4. 关于RouterOS 国内DDNS服务

    虽然RouterOS 加入了cloud功能,但最近在配置RB2011的时候发现不好使,更新域名后无法正确解析到我的IP地址,虽然在cloud的public address中显示了正确的公网ip地址,但 ...

  5. js 取元素相对页面的高度和宽度

    function pos(elem) {    var x = elem.offsetLeft,  y = elem.offsetTop;    while (elem = elem.offsetPa ...

  6. linux centos 6.1 安装 redis

    1, yum install redis 检测是否有redis 2,没有的话就运行:yum install epel-release 3,再执行 yum install redis

  7. HTTP 协议基础

    HTTP 协议的主要特点可概括如下: 1.支持客户/服务器模式. 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联 ...

  8. ffmpeg默认输出中文为 UTF-8

    在使用ffmpeg 进行对音视频文件解码输出信息的时候会出现乱码. 从网上找到了说ffmpeg默认格式 为 utf-8 如果vs工程使用的的 Unicode 则需要将 utf-8转 Unicode 才 ...

  9. Java匿名内部类的学习

    新建一个抽象类或者接口,抽象类中只要有一个抽象方法就是抽象类,接口的定义是:里面的方法全部都是抽象方法,接口和抽象类不能直接实例化,需要子类来实现 /* 匿名内部类: 1.匿名内部类其实就是内部类的简 ...

  10. POJ2533 最长递增子序列

    描述: 7 1 7 3 5 9 4 8 输出4 最长递增子序列为1 3 5 9,不必连续. 解法: 三种思路: 转化为最长公共子序列(n^2),动态规划(n^2),不知叫什么解法(nlogn). 解法 ...