systemd进程启动管理实验(Ubuntu18.04)

参考资料

systemd入门教程:命令篇

systemd入门教程:实战篇

实验1

实验环境:ubuntu18.04虚拟机

流程:利用systemd,执行一个脚本,从而创建进程A运行一个无限循环二进制文件。将进程A杀死,systemd经过规定的一段时间后,重新启动同一脚本,创建进程B运行同一个无限循环二进制文件。

1.创建二进制文件

创建main.c

#include <stdio.h>
int main()
{
	//printf("start a!\n");
	while(1);
	return 0;
}

编译成main.out:

gcc main.c -o main.out

2.创建脚本

脚本demo.local

#!/bin/bash
/home/lzw/systemd_test/main.out

将脚本中的路径改为自己电脑中main.out的路径,注意要用绝对地址。如果自己电脑的SHELL不是bash也要改掉。

3.创建service配置文件

SystemD的配置文件位于/etc/systemd/system,在此目录下创建文件demo.service

[Unit]
Description=test server daemon

[Service]
ExecStart=/home/lzw/systemd_test/demo.local #该服务的启动脚本路径
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

ExecStart的路径修改为自己电脑中的路径,注意要绝对地址。其他参数含义请查看参考资料

4.执行

激活开机启动,会创建service文件的软链接到/etc/systemd/system/multi-user.target.wants

sudo systemctl enable demo.service

之后重新启动系统就可以自动运行main.out。

也可以不重启直接运行,继续执行如下命令:

sudo systemctl daemon-reload  #重新加载配置文件
sudo systemctl start demo     #启动demo服务

如需多次改动service配置文件,可以创建一个脚本,每次改动后直接执行:

#!/bin/bash
sudo systemctl stop demo.service
sudo systemctl daemon-reload
sudo systemctl restart demo

注意在demo还在运行时,不要改动service配置文件。

5.kill进程

ps -ef命令查看main.out进程结果:

UID         PID   PPID  C STIME TTY          TIME CMD
...
root      11887      1  0 14:26 ?        00:00:00 /bin/bash /home/lzw/systemd_test/demo.local
root      11888  11887 99 14:26 ?        00:00:01 /home/lzw/systemd_test/main.out
...

可以看到脚本进程为父进程,启动了main.out子进程。

sudo kill 11888将main.out进程杀死,会发现两个进程都不见了。

等待10秒后,再次查看进程,可以看到两个进程又出现了,并且进程号不同。

实验2

实验环境:ubuntu18.04虚拟机

流程:利用systemd,执行一个脚本,从而创建进程A运行一个无限循环二进制文件。将进程A杀死,systemd自动启动另一脚本,创建进程B运行另一个无限循环二进制文件。

1.创建二进制文件

创建main.c

#include <stdio.h>
int main()
{
	//printf("start a!\n");
	while(1);
	return 0;
}

编译成main1.outmain2.out:

gcc main.c -o main1.out
gcc main.c -o main2.out

2.创建脚本

进程A的脚本demo1.local

#!/bin/bash
/home/lzw/systemd_test/main1.out

进程B的脚本demo2.local

#!/bin/bash
/home/lzw/systemd_test/main2.out

将脚本中的路径改为自己电脑中main1.out和main2.out的路径,注意要用绝对地址。如果自己电脑的SHELL不是bash也要改掉。

3.创建service配置文件

SystemD的配置文件位于/etc/systemd/system,在此目录下创建文件demo.service

[Unit]
Description=test server daemon

[Service]
ExecStart=/home/lzw/systemd_test/demo1.local #该服务的启动脚本
ExecStopPost=/home/lzw/systemd_test/demo2.local #该服务停止后的执行脚本
ExecReload=/bin/kill -HUP $MAINPID
Type=simple

[Install]
WantedBy=multi-user.target

ExecStart和ExecStopPost的路径修改为自己电脑中的路径,注意要绝对地址。其他参数含义请查看参考资料

4.执行

#!/bin/bash
sudo systemctl stop demo.service
sudo systemctl daemon-reload
sudo systemctl restart demo

5.kill进程

ps -ef命令查看main1.out进程结果:

UID         PID   PPID  C STIME TTY          TIME CMD
...
root      11356      1  0 14:29 ?        00:00:00 /bin/bash /home/lzw/systemd_test/demo1.local
root      11357  11356 99 14:29 ?        00:00:01 /home/lzw/systemd_test/main1.out
...

sudo kill 11357将main1.out进程杀死,再次查看进程:

UID         PID   PPID  C STIME TTY          TIME CMD
...
root      11712      1  0 14:30 ?        00:00:00 /bin/bash /home/lzw/systemd_test/demo2.local
root      11713  11712 99 14:30 ?        00:00:01 /home/lzw/systemd_test/main2.out
...

发现main1.out的两个进程不见了,取而代之的是main2.out的两个进程。

实验3

实验环境:ubuntu18.04虚拟机

流程:服务A运行一个二进制文件,作用是延时100秒。等延时结束后,才启动服务B,执行一句ECHO命令。

1.创建二进制文件

创建pro_a.c

#include <stdio.h>
int main()
{
	sleep(100);
	return 0;
}

编译成pro_a.out:

gcc pro_a.c -o pro_a.out

2.创建脚本

进程A的脚本demo1.local

#!/bin/bash
/home/lzw/systemd_test/pro_a.out

进程B的脚本demo2.local

#!/bin/bash
/bin/echo 111>>/home/lzw/systemd_test/echo

并且在/home/lzw/systemd_test/创建一个echo空文件。

将脚本中的路径改为自己电脑中main1.out和main2.out的路径,注意要用绝对地址。如果自己电脑的SHELL不是bash也要改掉。

3.创建service配置文件

systemd的配置文件位于/etc/systemd/system,在此目录下创建文件test_3_a .service

[Unit]
Description=test_3_a server daemon

[Service]
ExecStartPre=/home/lzw/systemd_test/test_3/demo.local
ExecStart=/bin/kill -HUP $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Type=simple

[Install]
WantedBy=multi-user.target

ExecStart和ExecStopPre的路径修改为自己电脑中的路径,注意要绝对地址。其他参数含义请查看参考资料

创建文件test_3_a .service

[Unit]
Description=test_3_b server daemon
After=test_3_a.service

[Service]
ExecStart=/home/lzw/systemd_test/test_3/demo_b_1.local
ExecReload=/bin/kill -HUP $MAINPID
Type=simple

[Install]
WantedBy=multi-user.target

4.执行

sudo systemctl enable test_3_a.service
sudo systemctl enable test_3_b.service
sudo systemctl daemon-reload
sudo systemctl start test_3_a
sudo systemctl start test_3_b

5.结果

进程pro_a.out出现并一直持续100秒,期间echo文件并没有被改变。

直到100秒结束,进程pro_a.out被kill,这时echo文件出现111的值,说明服务B被启动。

其他错误导致进程崩溃

越界

out_of_range.c:

#include <stdio.h>
int main()
{
	int a[2]={0,0};
	*(volatile int *)(0x80000000) = a[3];

	while(1);
	return 0;
}

栈溢出

stack_overflow.c:

#include <stdio.h>
void F(int n)
{
	F(n);
}
int main()
{
	F(1);
	while(1);
	return 0;
}

数值溢出

arithmetic_overflow.c

#include <stdio.h>
int F(int n)
{
	return n*F(n-1);
}
int main()
{
	F(100);

	while(1);
	return 0;
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐