# 守护进程-03-systemed
看当前shell的pid
echo $$
看某个进程的pid可以用pidof,比如看nginx的
pidof nginx
在centos 6
时代我们要配置一个开机启动的程序时,可以在/etc/rc.local
中添加启动命令,在/etc/init.d
中添加启动脚本。到了centos 7
时发现不推荐用init
了,有了一个船新的系统systemed。
# systemed
还是拿之前的例子:
#include <stdio.h>
main(void)
{
int d = 1;
while(1){
printf("hello %d \n",d);
fflush(stdout);
sleep(1);
d += 1;
};
return 0;
}
编译下得到a.out。
我们利用systemctl工具,将a.out添加到systemed系统中。
在/lib/systemd/system
中创建一个文件test-server.service
,内容如下:
[Unit]
Description=my test service
[Service]
ExecStart= /root/test/a.out
[Install]
WantedBy=multi-user.target
通过systemctl
命令启用它
root@lan-dev-215:~/test# systemctl enable /lib/systemd/system/test-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/test-server.service to /lib/systemd/system/test-server.service.
此时看下它的状态
root@lan-dev-215:~/test# systemctl status test-server
● test-server.service - my test service
Loaded: loaded (/lib/systemd/system/test-server.service; enabled; vendor preset: enabled)
Active: inactive (dead)
启动
systemctl start test-server
再看下它的状态
root@lan-dev-215:~/test# systemctl status test-server
● test-server.service - my test service
Loaded: loaded (/lib/systemd/system/test-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-01-31 21:09:01 CST; 3s ago
Main PID: 5110 (a.out)
Tasks: 1
Memory: 188.0K
CPU: 2ms
CGroup: /system.slice/test-server.service
└─5110 /root/test/a.out
Jan 31 21:09:01 lan-dev-215 systemd[1]: Started my test service.
Jan 31 21:09:01 lan-dev-215 a.out[5110]: hello 1
Jan 31 21:09:02 lan-dev-215 a.out[5110]: hello 2
Jan 31 21:09:03 lan-dev-215 a.out[5110]: hello 3
Jan 31 21:09:04 lan-dev-215 a.out[5110]: hello 4
可以看到正常运行了。
# systemed.service 配置文件
主要是三部分:[Unit], [Service],[Install]。 简单介绍下: [Unit] 主要是对这个服务的说明,内容, 文档介绍以及对一些依赖服务定义 [Service] 服务的主体定义,主要定义服务的一些运行参数,及操作动作 [Install] 服务安装的相关设置,一般可设置为多用户的 更多在这里:https://www.freedesktop.org/software/systemd/man/systemd.service.html
这里关注Service中的Restart参数。 Restart有这些值:always(总是重启)、no 、on-success、on-failure、on-abnormal、on-abort、on-watchdog 每个值对应支持的事件如下:
Restart settings/Exit causes | no | always | on-success | on-failure | on-abnormal | on-abort | on-watchdog |
---|---|---|---|---|---|---|---|
Clean exit code or signal | X | X | |||||
Unclean exit code | X | X | |||||
Unclean signal | X | X | X | X | |||
Timeout | X | X | X | ||||
Watchdog | X | X | X | X |
回到刚才的service配置文件,里面没有Restart参数,我们去kill一下看看:
root@lan-dev-215:~/test# kill 5110
root@lan-dev-215:~/test# systemctl status test-server
● test-server.service - my test service
Loaded: loaded (/lib/systemd/system/test-server.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Fri 2020-01-31 21:34:53 CST; 2s ago
Process: 5506 ExecStart=/root/test/a.out (code=killed, signal=TERM)
Main PID: 5506 (code=killed, signal=TERM)
Jan 31 21:34:43 lan-dev-215 a.out[5506]: hello 5
Jan 31 21:34:44 lan-dev-215 a.out[5506]: hello 6
Jan 31 21:34:45 lan-dev-215 a.out[5506]: hello 7
Jan 31 21:34:46 lan-dev-215 a.out[5506]: hello 8
Jan 31 21:34:47 lan-dev-215 a.out[5506]: hello 9
Jan 31 21:34:48 lan-dev-215 a.out[5506]: hello 10
Jan 31 21:34:49 lan-dev-215 a.out[5506]: hello 11
Jan 31 21:34:50 lan-dev-215 a.out[5506]: hello 12
Jan 31 21:34:51 lan-dev-215 a.out[5506]: hello 13
Jan 31 21:34:52 lan-dev-215 a.out[5506]: hello 14
root@lan-dev-215:~/test# ps aux | grep a.out
root 5562 0.0 0.0 14428 1056 pts/2 S+ 21:37 0:00 grep --color=auto a.out
可以看到test-server变成了inactive状态,a.out 也没有了。 在test-server.service中增加Restart配置,配置为always
[Unit]
Description=my test service
[Service]
ExecStart= /root/test/a.out
Restart= always
[Install]
WantedBy=multi-user.target
reload一下,让配置生效
systemctl daemon-reload
此时test-server是运行状态了
root@lan-dev-215:~/test# systemctl status test-server
● test-server.service - my test service
Loaded: loaded (/lib/systemd/system/test-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-01-31 21:42:05 CST; 34s ago
Main PID: 5737 (a.out)
CGroup: /system.slice/test-server.service
└─5737 /root/test/a.out
Jan 31 21:42:30 lan-dev-215 a.out[5737]: hello 26
Jan 31 21:42:31 lan-dev-215 a.out[5737]: hello 27
Jan 31 21:42:32 lan-dev-215 a.out[5737]: hello 28
Jan 31 21:42:33 lan-dev-215 a.out[5737]: hello 29
Jan 31 21:42:34 lan-dev-215 a.out[5737]: hello 30
Jan 31 21:42:35 lan-dev-215 a.out[5737]: hello 31
Jan 31 21:42:36 lan-dev-215 a.out[5737]: hello 32
Jan 31 21:42:37 lan-dev-215 a.out[5737]: hello 33
Jan 31 21:42:38 lan-dev-215 a.out[5737]: hello 34
Jan 31 21:42:39 lan-dev-215 a.out[5737]: hello 35
kill掉再看下
root@lan-dev-215:~/test# kill 5737
root@lan-dev-215:~/test# systemctl status test-server
● test-server.service - my test service
Loaded: loaded (/lib/systemd/system/test-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-01-31 21:47:29 CST; 845ms ago
Main PID: 5941 (a.out)
Tasks: 1
Memory: 128.0K
CPU: 2ms
CGroup: /system.slice/test-server.service
└─5941 /root/test/a.out
Jan 31 21:47:29 lan-dev-215 systemd[1]: Started my test service.
Jan 31 21:47:29 lan-dev-215 a.out[5941]: hello 1
可以看到a.out重新运行了,实现了守护进程。