# 守护进程-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重新运行了,实现了守护进程。