linux磁盘分裂,Linux Guard Service - 进程分裂与脱离(示例代码)

进程分裂更名

void set_ps_name(char *name) {

prctl(PR_SET_NAME, name);

}

修改进程长名称

备份进程环境变量空间

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]);

}

写入进程长名称

sprintf(argv[0], name);

还原进程环境变量

// for(i=1; i

// sprintf(argv[i],argv_new[i]);

// }

// for(i=0; i

// sprintf(environ[i],new_environ[i]);

// }

进程杀死后自动恢复

等级子进程的PID

void add_index(char **index, int i, pid_t pid) {

index[i] = (char *) malloc(sizeof(char) * 10);

sprintf(index[i], "%d", pid);

}

每隔一秒检查一次所有进程,为已经死亡的进程重新分裂并登记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值