systemd入门教程:命令篇
systemd入门教程:实战篇
实验环境:ubuntu18.04虚拟机
流程:利用systemd,执行一个脚本,从而创建进程A运行一个无限循环二进制文件。将进程A杀死,systemd经过规定的一段时间后,重新启动同一脚本,创建进程B运行同一个无限循环二进制文件。
创建main.c
:
#include <stdio.h>
int main()
{
//printf("start a!\n");
while(1);
return 0;
}
编译成main.out
:
gcc main.c -o main.out
脚本demo.local
:
#!/bin/bash
/home/lzw/systemd_test/main.out
将脚本中的路径改为自己电脑中main.out的路径,注意要用绝对地址。如果自己电脑的SHELL不是bash也要改掉。
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的路径修改为自己电脑中的路径,注意要绝对地址。其他参数含义请查看参考资料
激活开机启动,会创建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配置文件。
用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秒后,再次查看进程,可以看到两个进程又出现了,并且进程号不同。
实验环境:ubuntu18.04虚拟机
流程:利用systemd,执行一个脚本,从而创建进程A运行一个无限循环二进制文件。将进程A杀死,systemd自动启动另一脚本,创建进程B运行另一个无限循环二进制文件。
创建main.c
:
#include <stdio.h>
int main()
{
//printf("start a!\n");
while(1);
return 0;
}
编译成main1.out
和main2.out
:
gcc main.c -o main1.out
gcc main.c -o main2.out
进程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也要改掉。
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的路径修改为自己电脑中的路径,注意要绝对地址。其他参数含义请查看参考资料
#!/bin/bash
sudo systemctl stop demo.service
sudo systemctl daemon-reload
sudo systemctl restart demo
用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的两个进程。
实验环境:ubuntu18.04虚拟机
流程:服务A运行一个二进制文件,作用是延时100秒。等延时结束后,才启动服务B,执行一句ECHO命令。
创建pro_a.c
:
#include <stdio.h>
int main()
{
sleep(100);
return 0;
}
编译成pro_a.out
:
gcc pro_a.c -o pro_a.out
进程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也要改掉。
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
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
进程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;
}